Почему оператор присваивания возвращает ссылку на объект?

Я делаю некоторую ревизию моего С++, и я имею дело с перегрузкой оператора в минуту, в частности с оператором "=" (присваивание). Я смотрел онлайн и сталкивался с несколькими темами, обсуждая это. В моих собственных заметках у меня все мои примеры сняты как-то вроде

class Foo
{
    public:  
        int x;  
        int y;  
        void operator=(const Foo&);  
};  
void Foo::operator=(const Foo &rhs)
{
    x = rhs.x;  
    y = rhs.y;  
}

Во всех ссылках, найденных в Интернете, я заметил, что оператор возвращает ссылку на исходный объект. Почему правильный способ вернуть ссылку на объект в отличие от ничего?

Ответы

Ответ 1

Обычная форма возвращает ссылку на целевой объект, чтобы разрешить цепочку привязки. В противном случае это было бы невозможно:

Foo a, b, c;
// ...
a = b = c;

Тем не менее, имейте в виду, что получение права оператора-ассистента более жесткое, чем может показаться.

Ответ 2

Тип возвращаемого значения не имеет значения, когда вы просто выполняете одно задание в следующем выражении:

x = y;

Это начинает иметь значение, когда вы это делаете:

if ((x = y)) {

... и действительно имеет значение, когда вы это делаете:

x = y = z;

Для чего вы возвращаете текущий объект: чтобы назначить назначения цепочки с правильной ассоциативностью. Это хорошая общая практика.

Ответ 3

Ваш оператор назначения всегда должен выполнять следующие три:

  • Возьмите входной сигнал const-reference (const MyClass &rhs) как правую часть задания. Причина этого должна быть очевидной, поскольку мы не хотим случайно изменить это значение; мы только хотим изменить то, что с левой стороны.

  • Всегда возвращайте ссылку на недавно измененную левую сторону, return *this. Это должно позволить цепочку операторов, например. a = b = c;.

  • Всегда проверяйте самоназначение (this == &rhs). Это особенно важно, когда ваш класс выполняет собственное выделение памяти.

    MyClass& MyClass::operator=(const MyClass &rhs) {
        // Check for self-assignment!
        if (this == &rhs) // Same object?
            return *this; // Yes, so skip assignment, and just return *this.
    
        ... // Deallocate, allocate new space, copy values, etc...
    
        return *this; //Return self
    }