当我在书籍和网络中阅读时,在C 中,我们可以用这些原型超载" plus"或"减去"操作员(作为class Money
的成员函数):
const Money operator +(const Money& m2) const;
const Money operator -(const Money& m2) const;
和:
的分配运营商 const Money& operator =(const Money& m2);
为什么使用对货币对象的引用作为分配运算符超载中的返回值,而不是在加号和减去操作员中?
从分配中返回参考允许链接:
a = b = c; // shorter than the equivalent "b = c; a = b;"
(在大多数情况下,如果操作员返回了新值的副本,但这通常会效率。)
)我们无法从算术操作中返回参考,因为它们产生了新值。返回新值的唯一(明智的)方法是按值返回它。
如您的示例,返回恒定值可以防止语义移动,所以不要这样做。
,因为 operator+
和 operator-
不要对 this 对象作用,而是从另一个对象返回该对象的求和(或减法)的新对象。<<<<<<<<<<<</p>
operator=
是不同的,因为它实际上是将分配给此对象。
operator+=
和 operator-=
将作用于此对象,并且与 operator=
更近的类似物。
考虑您要问的内容。您需要一个表达式a + b
返回对A或B之一的引用,该引用将具有表达式的结果。因此,您将修改A或B之一作为A和B的总和。因此,您需要重新定义操作员的语义( )与操作员( =)相同。就像@manuell所说的那样,您因此允许(a + b) = c
。您建议的语义已经由 =和 - =。
我认为,如果您在超载分配运算符中按值返回,那是因为分配运营商的关联性。考虑一下:
int a = b = c = 3;
这里的关联性如下:(a =(b =(c = 3)))
但考虑iostream操作cout&lt;&lt;x&lt;&lt;y&lt;&lt;z;
这里的关联性如下:(((((cout&lt;&lt; x)&lt;&lt; y)&lt; z);
您可以看到X将首先打印,因此,如果您按值返回,则&lt;&lt;运营商,返回值不会是" lvalue",而通过折叠返回是一个lvalue,因此级联的&lt;&lt;可以实现操作员。
另外一个点,如果您按值返回,则复制构造函数将被调用。(返回的情况并非如此)
我猜想有更好的解释C
除了在链式分配过程中效率(例如a = b = c;
)外,被接受的答案指出的那样,这也是惯例的问题。请参考Scott Meyers的有效C 项目10。这是一个约定,然后是标准库中的内置类型和所有类型。