Форум программистов, компьютерный форум CyberForum.ru

перегрузка операторов - C++

Восстановить пароль Регистрация
 
ЛеЖиК)
 Аватар для ЛеЖиК)
157 / 60 / 1
Регистрация: 29.04.2011
Сообщений: 630
25.12.2011, 15:04     перегрузка операторов #1
попробую объяснить на примере
допустим есть класс
C++
1
2
3
4
5
6
class myclass
{
private:
    string stroka;
public:
    myclass(string strok){stroka=strok;}
мне нужно как то перегрузить оператор = что бы при выполнение такого кода
C++
1
2
myclass q="asd";
string qq=q;
в qq оказалось asd.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2011, 15:04     перегрузка операторов
Посмотрите здесь:

C++ Перегрузка операторов(=,+)
C++ Перегрузка операторов С++
C++ перегрузка операторов
C++ Перегрузка операторов
C++ Перегрузка операторов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
25.12.2011, 15:24     перегрузка операторов #2
Тут нужен оператор приведения к типу. Я написал заодно и оператор "=" но он нужен в "обратном" случае.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <string>
#include <iostream>
 
using std::string;
 
class myclass {
 private:
  string stroka;
 public:
  explicit myclass(const string &strok) : stroka(strok) {}
  operator string() { return stroka; }
  myclass &operator=(const char *strok) {
    stroka = strok;
    return *this;
  }
};
 
int main(int argc, char *argv[]) {
  myclass a("some text");
  a = "asdf"; // loosing "some text"
  string b = a; // b = "asdf"
  std::cout << b << std::endl;
  return 0;
}
ЛеЖиК)
 Аватар для ЛеЖиК)
157 / 60 / 1
Регистрация: 29.04.2011
Сообщений: 630
25.12.2011, 15:39  [ТС]     перегрузка операторов #3
если честно не понял код по этому куча вопросов



Цитата Сообщение от lemegeton Посмотреть сообщение
(const string &strok) : stroka(strok)
что делает текст который после двоеточия (не как не могу сформулировать этот вопрос гуглу)

почему перегружаем оператор () и он возврашает строку, хотя при использование пишем равно

что мне было понятно не могли бы вы закоментить весь код класса
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
25.12.2011, 15:41     перегрузка операторов #4
Цитата Сообщение от ЛеЖиК) Посмотреть сообщение
что делает текст который после двоеточия (не как не могу сформулировать этот вопрос гуглу)
инициализация
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
25.12.2011, 15:44     перегрузка операторов #5
для понимания ':' ищите в гугле "список инициализации мемберов класса".
оператор string () - это оператор неявного преобразования объекта класса mуclass в строку

C++
1
2
myclass a("some text");
string b = a;
у класса стринг нет конструктора или оператора =, который бы принимал в качестве аргумента класс myclass. Комплиятор в этом случае смотрит, а можно ли как нибудь из объекта класса myclass сделать строку. Он находит вот такой специальный оператор преобразования в строку (operator string()) и подставляет в этом месте вызов этого оператора. В результате код компилируется.
ЛеЖиК)
 Аватар для ЛеЖиК)
157 / 60 / 1
Регистрация: 29.04.2011
Сообщений: 630
25.12.2011, 15:56  [ТС]     перегрузка операторов #6
большое спасибо

Добавлено через 3 минуты
то есть если заменить
C++
1
explicit myclass(const string &strok) : stroka(strok) {}
на
C++
1
explicit myclass(const string &strok)  {stroka=strok;}
нечего страшного не произойдет?
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
25.12.2011, 16:01     перегрузка операторов #7
код останется корректным, но чуть менее эффективным. для кого-то это страшно, для кого-то нет. но лучше сразу привыкать делать по нормальному, т.е. инициализировать в списке инициализации, тем более что иногда нужна именно инициализация в списке инициализации (например для констант или ссылок или для объектов без дефолтного конструктора).
ЛеЖиК)
 Аватар для ЛеЖиК)
157 / 60 / 1
Регистрация: 29.04.2011
Сообщений: 630
26.12.2011, 19:42  [ТС]     перегрузка операторов #8
а если у меня несколько вариантов функции конструктора, то надо в каждой перегрузке создавать список инициализации
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
27.12.2011, 01:40     перегрузка операторов #9
До использования нового стандарта С++11, да, все конструкторы должны инициализировать все члены класса отдельно.
ЛеЖиК)
 Аватар для ЛеЖиК)
157 / 60 / 1
Регистрация: 29.04.2011
Сообщений: 630
27.12.2011, 08:23  [ТС]     перегрузка операторов #10
а сейчас
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
27.12.2011, 08:25     перегрузка операторов #11
ЛеЖиК), А сейчас есть delegating constructors.
Но появились они в gcc только в 4.7 релиза которого еще не было.
ЛеЖиК)
 Аватар для ЛеЖиК)
157 / 60 / 1
Регистрация: 29.04.2011
Сообщений: 630
27.12.2011, 08:46  [ТС]     перегрузка операторов #12
так
вообщем мне в каждой перегрузке писать?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.12.2011, 08:53     перегрузка операторов
Еще ссылки по теме:

C++ Перегрузка операторов + и =
Перегрузка операторов C++
C++ Перегрузка операторов +=, -=, *= и /=

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
27.12.2011, 08:53     перегрузка операторов #13
ЛеЖиК), Да.
Yandex
Объявления
27.12.2011, 08:53     перегрузка операторов
Ответ Создать тему
Опции темы

Текущее время: 08:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru