Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我们在赋值运算符重载中使用引用返回,而不是在加减运算中使用? P>当我在书和Web中阅读时,在C++中,我们可以用这些原型来重载“加号”或“减号”操作符(作为代码的成员函数):_C++_Operators_Operator Overloading_Return By Reference_Return By Value - Fatal编程技术网

为什么我们在赋值运算符重载中使用引用返回,而不是在加减运算中使用? P>当我在书和Web中阅读时,在C++中,我们可以用这些原型来重载“加号”或“减号”操作符(作为代码的成员函数):

为什么我们在赋值运算符重载中使用引用返回,而不是在加减运算中使用? P>当我在书和Web中阅读时,在C++中,我们可以用这些原型来重载“加号”或“减号”操作符(作为代码的成员函数):,c++,operators,operator-overloading,return-by-reference,return-by-value,C++,Operators,Operator Overloading,Return By Reference,Return By Value,const Money操作符+(const Money&m2)const const Money操作符-(const Money&m2)const 对于具有以下功能的赋值运算符: const Money&operator=(const Money&m2) 为什么在赋值运算符重载中使用对货币对象的引用作为返回值,而不是在加号和减号运算符中使用?从赋值中返回引用允许链接: a = b = c; // shorter than the equivalent "b = c; a = b;" (如果运

const Money操作符+(const Money&m2)const

const Money操作符-(const Money&m2)const

对于具有以下功能的赋值运算符:

const Money&operator=(const Money&m2)


为什么在赋值运算符重载中使用对货币对象的引用作为返回值,而不是在加号和减号运算符中使用?从赋值中返回引用允许链接:

a = b = c;  // shorter than the equivalent "b = c; a = b;"
(如果运算符返回新值的副本,这也会起作用(在大多数情况下),但通常效率较低。)

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


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

因为
操作符+
操作符-
不会作用于此对象,而是返回一个新对象,即此对象与另一个对象的总和(或减法)

operator=
是不同的,因为它实际上是在给这个对象赋值


operator+=
operator-=
将作用于此对象,与
operator=
更接近,请考虑您的要求。您需要一个表达式,
a+b
,以返回对a或b之一的引用,这将产生表达式的结果。因此,您可以将a或b中的一个修改为a和b的和。因此,您需要将运算符(+)的语义重新定义为与运算符(+=)相同。就像@manuell所说的,您将允许
(a+b)=c
。您建议的语义已经由+=和-=提供。

我想下面显示的链接有更好的解释

我认为,如果在重载赋值运算符中按值返回,这是因为赋值运算符具有关联性。考虑这一点:

INTA=b=c=3

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

<>但考虑碘流操作
如果在
+
-
二进制操作中返回引用,它应该引用什么?返回引用是没有意义的。该操作必须创建一个新对象。您不希望能够对a+b=c进行编码;为什么?不,作业链与作业操作员返回的内容无关。分配链接(如您的示例中所示)在任何版本中都是可能的。返回常量引用将阻止对lhs进行多次修改,如“(a=b)=c”,但情况不同。换句话说,需要从赋值返回非常量引用的情况相当深奥,通常属于“糟糕的编程实践”因为这个原因,人们甚至可能会看到一些来源明确建议从赋值中返回常量引用。@AndreyT:你说得对,我把自己弄糊涂了。(当然,您必须返回允许链接的内容;但它可以是值或常量引用。)