为什么我们在分配运算符过载中使用参考返回,而不是在加上Minus OPS中使用



当我在书籍和网络中阅读时,在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。这是一个约定,然后是标准库中的内置类型和所有类型。

最新更新