Стандарты программирования на С++. 101 правило и рекомендация | страница 50



>T& operator@=(T& lhs, const T& rhs) {

> // ... реализация ...

> return lhs;

>}


>T operator@(T lhs, const T& rhs) { // lhs передано по значению

> return lhs @= rhs;

>}

Еще один вариант — оператор >operator@, который возвращает >const-значение. Эта методика имеет то преимущество, что при этом запрещается такой не имеющий смысла код, как >a+b=c, но в этом случае мы теряем возможность применения потенциально полезных конструкций наподобие >а = (b+c).replace(pos, n, d). А это весьма выразительный код, который в одной строчке выполняет конкатенацию строк >b и с, заменяет некоторые символы и присваивает полученный результат переменной .

Примеры

Пример. Реализация >+= для строк. При конкатенации строк полезно заранее знать длину, чтобы выделять память только один раз:

>String& String::operator+=( const String& rhs ) {

> // ... Реализация ...

> return *this;

>}


>String operator+( const String& lhs, const String& rhs ) {

> String temp; // изначально пуста

> // выделение достаточного количества памяти

> temp.Reserve(lhs.size() + rhs.size());

> // Конкатенация строк и возврат

> return (temp += lhs) += rhs;

>}

Исключения

В некоторых случаях (например, оператор >operator*= для комплексных чисел), оператор может изменять левый аргумент настолько существенно, что более выгодным может оказаться реализация оператора >operator*= посредством оператора >operator*, а не наоборот.

Ссылки

[Alexandrescu03a] • [Cline99] §23.06 • [Meyers96] §22 • [Sutter00] §20

28. Предпочитайте канонический вид ++ и --, и вызов префиксных операторов

Резюме

Особенность операторов инкремента и декремента состоит в том, что у них есть префиксная и постфиксная формы с немного отличающейся семантикой. Определяйте операторы >operator++ и >operator-- так, чтобы они подражали поведению своих встроенных двойников. Если только вам не требуется исходное значение — используйте префиксные версии операторов.

Обсуждение

Старая шутка гласит, что язык называется С++, а не ++С, потому что язык был улучшен (на что указывает инкремент), но многие продолжают использовать его как С (предыдущее значение до инкремента). К счастью, эту шутку можно считать устаревшей, но это отличная иллюстрация для понимания отличия между двумя формами операторов.

В случае >++ и >-- постфиксные формы операторов возвращают исходное значение, в то время как префиксные формы возвращают новое значение. Лучше всего реализовывать постфиксный оператор с использованием префиксного. Вот канонический вид такого использования: