Почему мы используем возврат ссылки в перегрузке оператора присваивания, а не в операциях плюс-минус?

Как я читал в книгах и в Интернете, в C ++ мы можем перегрузить операторы «плюс» или «минус» этими прототипами (как функции-члены class Money):

const Money operator +(const Money& m2) const;

const Money operator -(const Money& m2) const;

и для оператора присваивания с:

const Money& operator =(const Money& m2);

Зачем использовать ссылку на объект Money в качестве возвращаемого значения в перегрузке оператора присваивания, а не в операторах плюс и минус?

9

Решение

Возврат ссылки из присваивания позволяет создать цепочку:

a = b = c;  // shorter than the equivalent "b = c; a = b;"

(Это также будет работать (в большинстве случаев), если оператор вернет копию нового значения, но это, как правило, менее эффективно.)

Мы не можем вернуть ссылку из арифметических операций, так как они создают новое значение. Единственный (разумный) способ вернуть новое значение — это вернуть его по значению.

Возврат постоянного значения, как в вашем примере, предотвращает семантику перемещения, поэтому не делайте этого.

13

Другие решения

Так как operator+ а также operator- не действуй на этот объект, но вернуть новый объект, который является суммой (или вычитанием) этого объекта из другого.

operator= отличается, потому что это на самом деле назначение что-то для этого объекта.

operator+= а также operator-= будет действовать на этот объект, и является более близким аналогом operator=,

4

Подумайте, что вы спрашиваете. Вы хотели бы выражение, a + b, чтобы вернуть ссылку на один из a или b, который будет иметь результаты выражения. Таким образом, вы бы изменили один из a или b, чтобы он был суммой a и b. Таким образом, вы захотите переопределить семантику оператора (+), чтобы он совпадал с оператором (+ =). И, как сказал @manuell, вы позволите (a + b) = c, Семантика, которую вы предлагаете, уже предлагается + = и — =.

2

Я думаю, что это хорошо, если вы возвращаете по значению в перегруженном операторе присваивания, то есть из-за ассоциативности оператора присваивания. учти это:

int a = b = c = 3;

здесь ассоциативность выглядит следующим образом:
(А = (Ь = (с = 3)))

но рассмотрим операцию iostream
соиЬ << Икс << Y << z;

здесь ассоциативность выглядит следующим образом:
(((СоиЬ << Икс )<< у) << я);

вы можете видеть, что x будет напечатан первым, поэтому, если вы вернетесь по значению при перегрузке << оператор, возвращаемое значение не будет «lvalue», в то время как возврат по refrence является lvalue, поэтому каскадное << Оператора можно добиться.

еще один момент, конструктор копирования будет вызван, если вы вернетесь по значению. (что не относится к возврату по ссылке)

0

Ссылка показанная ниже имеет лучшее объяснение, я думаю
возвращаемое значение перегрузки оператора в C ++

0
По вопросам рекламы [email protected]