Правило 10: Операторы присваивания должны возвращать ссылку на *this
Правило 10: Операторы присваивания должны возвращать ссылку на *this
Одно из интересных свойств присваивания состоит в том, что такие операции можно выполнять последовательно:
int x,y,z;
x = y = z = 15; // цепочка присваиваний
Также интересно, что оператор присваивания правоассоциативен, поэтому приведенный выше пример присваивания интерпретируется следующим образом:
x = (y = (z = 15));
Здесь переменной z присваивается значение 15, затем результат присваивания (новое значение z) присваивается переменной y, после чего результат (новое значение y) присваивается переменной x.
Достигается это за счет того, что оператор присваивания возвращает ссылку на свой левый аргумент, и этому соглашению вы должны следовать при реализации операторов присваивания в своих классах:
class Widget {
public:
...
Widget& operator=(const Widget& rhs) // возвращаемый тип – ссылка
{ // на текущий класс
...
return *this; // вернуть объект из левой части
} // выражения
...
};
Это соглашение касается всех операторов присваивания, а не только стандартной формы, показанной выше. Следовательно:
class Widget {
public:
...
Widget& operator+=(const Widget& rhs) // соглашение распространяется на
{ // +=, -=, *=, и т. д.
...
return *this;
}
Widget& operator=(int rhs) // это относится даже
{ // к параметрам разных типов
...
return *this;
}
...
};
Это всего лишь соглашение. Если программа его не придерживается, она тем не менее скомпилируется. Однако ему следуют все встроенные типы, как и все типы (см. правило 54) стандартной библиотеки (то есть string, vector, complex, tr1::shared_ptr и т. д.). Если у вас нет веской причины нарушать соглашение, не делайте этого.
Что следует помнить
• Пишите операторы присваивания так, чтобы они возвращали ссылку на *this.
Данный текст является ознакомительным фрагментом.