Почему оператор присваивания возвращает ссылку на объект?
Я делаю некоторую ревизию моего С++, и я имею дело с перегрузкой оператора в минуту, в частности с оператором "=" (присваивание). Я смотрел онлайн и сталкивался с несколькими темами, обсуждая это. В моих собственных заметках у меня все мои примеры сняты как-то вроде
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
}