#include <iostream.h>
#include <conio.h>
class Coord
{
int x, y;
public:
Coord() {x=y=0;}
Coord(int _x, int _y) { x=_x; y=_y;}
void GetCoord(int& _x, int& _y) { _x=x; _y=y; }
Coord& operator=(Coord& rhs);
};
Coord& Coord::operator=(Coord& rhs)
{
x=rhs.x;
y=rhs.y;
return *this;
}
int main()
{
int x, y;
Coord Pt1(10, 15), Pt2, Pt3;
Pt3=Pt2=Pt1;
Pt1.GetCoord(x, y);
cout<<"Pt1.x="<<x<<endl;
cout<<"Pt1.y="<<y<<endl;
Pt2.GetCoord(x, y);
cout<<"Pt2.x="<<x<<endl;
cout<<"Pt2.y="<<y<<endl;
Pt3.GetCoord(x, y);
cout<<"Pt3.x="<<x<<endl;
cout<<"Pt3.y="<<y<<endl;
getch();
return 0;
}
перегрузка оператора operator=
Код:
Код:
Coord Coord::operator=(Coord& rhs)
{
x=rhs.x;
y=rhs.y;
return *this;
}
{
x=rhs.x;
y=rhs.y;
return *this;
}
Как минимум - созданием временной копии.
Цитата: SergPas
Код:
Pt3=Pt2=Pt1;
Причём этот же код будет выполняться правильно, если операторная функции operator= будет возвращать не ссылку на объект, а сам объект:
А этот?
Код:
(Pt3=Pt2)=Pt1;
Цитата:
А этот?
Код:
(Pt3=Pt2)=Pt1;
Ну, здесь вы меня вообще запутали... Я согласен теперь с тем, что нужно возвращать по ссылке, но вообще запутался в процессе перегрузки операторов... Может разъясните теоретический аспект этого мероприятия?
Код:
Coord &Coord::operator=(const Coord& rhs)
Такую форму имеет генерируемый компилятором оператор присваивания по-умолчанию.
В данном случае
Код:
Pt3=Pt2=Pt1;
разницы действительно нет, так как в случае с ссылкой выражение Pt2=Pt1 вернет ссылку на объект Pt2, т.е. тот же самый объект Pt2. А вот в случае без ссылки вернет временную копию Pt2. Хотя на конечный результат и соотвественно на Pt3 это никак не влияет.
Чтобы этот код был понятен
Код:
(Pt3=Pt2)=Pt1;
Код:
Coord Pt1(10, 15), Pt2(2, 5), Pt3;
(Pt3=Pt2)=Pt1;
(Pt3=Pt2)=Pt1;
хотя и выглядит он немного странно.
В этом случае если используется ссылка, после выполнения (Pt3=Pt2) возвращается ссылка на Pt3 и последующее присваивание его к Pt1 соотвественно реально изменяет состояние Pt3.
Если же ссылка не используется, после выполнения (Pt3=Pt2) возвращается копия Pt3 и последующее присваивание его к Pt1 не оказывает никакого влияния на Pt3, изменяя лишь временную копию.
Цитата:
В этом случае если используется ссылка, после выполнения (Pt3=Pt2) возвращается ссылка на Pt3 и последующее присваивание его к Pt1 соотвественно реально изменяет состояние Pt3.
А я думал, что () в данном случае определяют порядок выполнения выражения, но не изменяют ассоциативность оператора = (справа налево)... Возможно я опять не правильно что-то понял, но из Ваших слов именно это и следует... Поправьте меня, если я не прав...
Вопрос, собственно говоря, снят с обсуждения... Всё дошло...
Спасибо всем, кто ответил!
Цитата: SergPas
А я думал, что () в данном случае определяют порядок выполнения выражения, но не изменяют ассоциативность оператора = (справа налево)
Все правильно. Но просто потому, что изменился порядок выполнения выражения (Pt3=Pt2) выполнится первым. :)