18

正如我在书籍和网络中所读到的,在 C++ 中,我们可以使用这些原型重载“加号”或“减号”运算符(作为 a 的成员函数class Money):

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

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

对于赋值运算符:

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

为什么在赋值运算符重载中而不是在加号和减号运算符中使用对 Money 对象的引用作为返回值?

4

5 回答 5

21

从赋值返回引用允许链接:

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

(如果运算符返回新值的副本,这也可以(在大多数情况下)起作用,但这通常效率较低。)

我们不能从算术运算中返回引用,因为它们会产生一个新值。返回新值的唯一(明智的)方法是按值返回。

正如您的示例所做的那样,返回一个常量值会阻止移动语义,所以不要这样做。

于 2014-01-31T16:45:43.943 回答
8

因为operator+并且operator-不作用于这个对象,而是返回一个新对象,它是这个对象与另一个对象的总和(或减法)。

operator=是不同的,因为它实际上是为这个对象分配了一些东西。

operator+=并且operator-=会作用于这个对象,并且更接近于operator=.

于 2014-01-31T16:46:20.917 回答
2

考虑你在问什么。您可能希望表达式 ,a + b返回对 a 或 b 之一的引用,这将具有表达式的结果。因此,您可以将 a 或 b 中的一个修改为 a 和 b 的总和。因此,您可能希望将运算符 (+) 的语义重新定义为与运算符 (+=) 相同。就像@manuell 说的那样,你会因此允许(a + b) = c. += 和 -= 已经提供了您建议的语义。

于 2014-01-31T16:49:21.423 回答
0

下面显示的链接有更好的解释我猜 C++中运算符重载的返回值

于 2015-05-04T14:48:40.220 回答
0

我认为如果你在重载的赋值运算符中按值返回它很好,那是因为赋值运算符的关联性。考虑一下:

诠释 a = b = c = 3 ;

这里的关联性如下: (a=(b=(c=3)))

但考虑 iostream 操作 cout << x << y << z ;

这里的关联性如下: (((cout << x )<< y) << z) ;

可以看到 x 会先打印出来,所以如果在 << 运算符的重载中按值返回,返回值不会是“左值”,而按引用返回是左值,因此可以实现 << 运算符的级联。

还有一点,如果按值返回,将调用复制构造函数。(这不是通过引用返回的情况)

于 2015-06-06T18:20:44.860 回答