Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

перегрузка оператора operator=

397
09 декабря 2008 года
SergPas
527 / / 03.02.2007
Есть код:
Код:
#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;
}
Так в чём разница возврата по ссылке от возврата по значению применительно к операторной функции operator=()?
505
09 декабря 2008 года
vAC
343 / / 28.02.2006
Как минимум - созданием временной копии.
505
09 декабря 2008 года
vAC
343 / / 28.02.2006
Цитата: SergPas

 
Код:
Pt3=Pt2=Pt1;

Причём этот же код будет выполняться правильно, если операторная функции operator= будет возвращать не ссылку на объект, а сам объект:



А этот?

 
Код:
(Pt3=Pt2)=Pt1;
397
09 декабря 2008 года
SergPas
527 / / 03.02.2007
Цитата:
А этот?
 
Код:
(Pt3=Pt2)=Pt1;


Ну, здесь вы меня вообще запутали... Я согласен теперь с тем, что нужно возвращать по ссылке, но вообще запутался в процессе перегрузки операторов... Может разъясните теоретический аспект этого мероприятия?

505
09 декабря 2008 года
vAC
343 / / 28.02.2006
Ну относительно оператора присваивания я бы просто рекомендовал использовать его каноническую форму:
 
Код:
Coord &Coord::operator=(const Coord& rhs)

Такую форму имеет генерируемый компилятором оператор присваивания по-умолчанию.
288
09 декабря 2008 года
nikitozz
1.2K / / 09.03.2007
А в чем собственно суть вопроса? Здесь вопрос даже скорее не о перегрузке операторов, а о ссылке на объект.
В данном случае
 
Код:
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) возвращается ссылка на Pt3 и последующее присваивание его к Pt1 соотвественно реально изменяет состояние Pt3.
Если же ссылка не используется, после выполнения (Pt3=Pt2) возвращается копия Pt3 и последующее присваивание его к Pt1 не оказывает никакого влияния на Pt3, изменяя лишь временную копию.
397
09 декабря 2008 года
SergPas
527 / / 03.02.2007
Цитата:
В этом случае если используется ссылка, после выполнения (Pt3=Pt2) возвращается ссылка на Pt3 и последующее присваивание его к Pt1 соотвественно реально изменяет состояние Pt3.


А я думал, что () в данном случае определяют порядок выполнения выражения, но не изменяют ассоциативность оператора = (справа налево)... Возможно я опять не правильно что-то понял, но из Ваших слов именно это и следует... Поправьте меня, если я не прав...
Вопрос, собственно говоря, снят с обсуждения... Всё дошло...
Спасибо всем, кто ответил!

288
09 декабря 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: SergPas
А я думал, что () в данном случае определяют порядок выполнения выражения, но не изменяют ассоциативность оператора = (справа налево)



Все правильно. Но просто потому, что изменился порядок выполнения выражения (Pt3=Pt2) выполнится первым. :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог