Правило 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.

Данный текст является ознакомительным фрагментом.



Поделитесь на страничке

Следующая глава >

Похожие главы из других книг:

Операторы присваивания 

Из книги автора

Операторы присваивания  В JScript, как и в языке С, для изменения содержимого переменных можно комбинировать оператор присваивания "=" с другими операторами (табл. П1.6).Таблица П1.6. Комбинации оператора присваивания и других операторов Оператор Описание = Простое


Операторы отношения и логические операторы

Из книги автора

Операторы отношения и логические операторы Операторы отношения используются для сравнения значений двух переменных. Эти операторы, описанные в табл. П2.11, могут возвращать только логические значения true или false.Таблица П2.11. Операторы отношения Оператор Условие, при


Операторы присваивания

Из книги автора

Операторы присваивания Оператор присваивания = нам уже знаком. Его еще называют оператором простого присваивания, поскольку он просто присваивает переменной новое значение:a = 2;b = c = 3;Второе выражение в приведенном примере выполняет присвоение значения 3 сразу двум


Как создать magnet-ссылку

Из книги автора

Как создать magnet-ссылку Magnet-ссылка создается очень просто. Здесь могут быть два варианта: вы создаете ссылку на раздаваемые вами файлы или вы создаете ссылку на файлы, которые желаете закачать к себе на компьютер. Технология создания ссылки одна. Вам следует открыть список


Операторы присваивания

Из книги автора

Операторы присваивания Оператор присваивания = нам уже знаком. Его еще называют оператором простого присваивания, поскольку он просто присваивает переменной новое значение:a = 2;b = c = 3;Второе выражение в приведенном примере выполняет присвоение значения 3 сразу двум


Как, разместив одну ссылку на сайт, получить еще сто

Из книги автора

Как, разместив одну ссылку на сайт, получить еще сто Всем известно: чем больше тематических сайтов ссылается на ваш сайт, тем выше фактор доверия, а соответственно и позиции в поисковых системах.Покупка качественных ссылок с тематических площадок, безусловно, даст


Оператор присваивания

Из книги автора

Оператор присваивания Оператор присваивания – :=. Для удобства понимания записи алгоритмов его можно читать, например, так:X := … – пусть X


R.5.17 Операции присваивания

Из книги автора

R.5.17 Операции присваивания Существует несколько операций присваивания, все они выполняются справа налево. Для всех них требуется, чтобы левым операндом был изменяемый адрес. Тип выражения присваивания совпадает с типом левого операнда. Результат операции присваивание -


R.13.4.3 Присваивания

Из книги автора

R.13.4.3 Присваивания Функция присваивания operator=() должна быть нестатической функцией-членом. Она не наследуется (§R.12.8). Более того, если пользователь не определил для класса X функцию operator=, то используется стандартная функция operator=, которая определяется как присваивание по


Операторы присваивания

Из книги автора

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


Глава 2 Конструкторы, деструкторы и операторы присваивания

Из книги автора

Глава 2 Конструкторы, деструкторы и операторы присваивания Почти во всех ваших классах будут определены один или несколько конструкторов, деструктор и оператор присваивания. Это функции, которые отвечают за операции создания и инициализации объекта, его уничтожения, а


Правило 21: Не пытайтесь вернуть ссылку, когда должны вернуть объект

Из книги автора

Правило 21: Не пытайтесь вернуть ссылку, когда должны вернуть объект Как только программисты осознают проблемы эффективности, связанные с передачей объектов по значению (см. правило 20), они, подобно крестоносцам, преисполняются решимости искоренить зло – передачу по