为什么我们在赋值运算符重载而不是正负操作中使用引用返回?

时间:2014-01-31 16:42:43

标签: c++ operators operator-overloading return-by-reference return-by-value

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

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

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

和赋值运算符:

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

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

5 个答案:

答案 0 :(得分:14)

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

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

(如果操作员返回了新值的副本,这也会起作用(在大多数情况下),但效率通常较低。)

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

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

答案 1 :(得分:7)

因为operator+operator-不会对对象执行操作,而是返回一个新对象,该对象是此对象与另一个对象的求和(或减法)。 / p>

operator=不同,因为它实际上是为此对象分配

operator+=operator-=会对此对象起作用,并且与operator=更接近。

答案 2 :(得分:2)

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

提供

答案 3 :(得分:0)

我猜测下面显示的链接有更好的解释 return value of operator overloading in C++

答案 4 :(得分:0)

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

int a = b = c = 3;

这里的结合性如下: (A =(B =(C = 3)))

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

这里的结合性如下: (((cout<< x)<< y)<< z);

你可以看到x将首先打印出来,所以如果你在重载时按值返回<<运算符,返回值不会是"左值" ,虽然通过refrence返回是一个左值,所以级联<<操作员可以实现。

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