Изучаю язык. Написал простенький класс:
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;
если вы его определили. Иначе компилятор выдаст сообщение об ошибке.
Комментариев нет:
Отправить комментарий