Страницы

Поиск по вопросам

понедельник, 4 февраля 2019 г.

Перегрузка оператор присвоения

Изучаю язык. Написал простенький класс:
class Point{ public: Point(); Point(int x, int y); private: int _x; int _y; }
Захотел преобразовать его в другой тип. По не знанию и паскалевской привычки написал такой оператор:
int operator=(const Point& src);
Скомпилировал класс вместе с оператором и все нормально скомпилировалось. Решил проверить на коде:
int main(int argc, char *argv[]) { Point pt(1, 2); int i; i = pt; }
Компиляция не удалась:
main.cpp:14: ошибка: cannot convert 'Point' to 'int' in assignment
Потом я нашел как преобразовать тип через другой оператор. Но мне интересно, раз компилятор дал мне скомпилировать этот оператор, значит наверно его, как то можно применить.
Вопрос: Что это оператор делает и как его можно использовать?


Ответ

Надо различать оператор присвоения и функцию преобразования.
Оператор присвоения не меняет тип объекта, которому присваивается выражение.
В вашем примере
class Point{ public: //... int operator=(const Point& src); //... };
оператор присваивания присваивает выражение объекту класса Point. Причем присваиваемое выражение имеет также ссылочный тип класса Point
Вы можете использовать возвращаемое значение выражения с данным оператором присваивания, чтобы присвоить его переменной типа int
Например,
int main(int argc, char *argv[]) { Point pt(1, 2); int i; i = pt = pt; }
Так как операторы присваивания выполняются справа налево, то сначала бы выполнилось присваивание
pt = pt
результатом которого было бы значение типа int, и только во втором присваивании это значение было бы занесено в переменную i
Если же вы хотите написать оператор преобразования, то он может выглядеть следующим образом:
operator int() const;
И тогда вы можете записать
i = pt;
Имейте в виду, что для не пользовательских типов вы не можете переопределить оператор присваивания. И в этом предложении
i = pt;
используется стандартное присваивание для целых чисел. Но так как pt не имеет целочисленный тип, то компилятор пытается его преобразовать к объекту целочисленного типа и вызывает для pt оператор
operator int() const;
если вы его определили. Иначе компилятор выдаст сообщение об ошибке.

Комментариев нет:

Отправить комментарий