正如我在书籍和网络上看到的那样,在C ++中,我们可以使用这些原型(作为class Money
的成员函数)重载“加”或“减”运算符:
const Money operator +(const Money& m2) const;
const Money operator -(const Money& m2) const;
和赋值运算符:
const Money& operator =(const Money& m2);
为什么在赋值运算符重载而不是在加号和减号运算符中使用对Money对象的引用作为返回值?
答案 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返回是一个左值,所以级联<<操作员可以实现。
再看一点,如果按值返回,将调用复制构造函数。 (通过引用返回不是这种情况)