让我们讨论这两个功能:
其中“complex”是实现复杂变量的类的名称。
所以第一个运算符返回引用,以便可以写一个+ = b + = c(相当于b = b + c; a = a + b;)。
第二个运算符返回和目标(不是参考),我们仍然可以写a = b + c + d。
谁能解释我这种细微差别?返回引用或对象有什么区别?
答案 0 :(得分:4)
赋值运算符支持对同一对象的多个应用程序:
(a += b) += c;
将b
和c
添加到a
。为此,a += b
必须返回对a
的引用。但是,加法运算符不需要这样,因为表达式b + c + d
没有副作用。只有a
的最终作业才会产生副作用。
答案 1 :(得分:1)
在某种程度上,你给出的例子就是细微差别。
你希望从+运算符中获得与你开始的两个不同的值:b + c既不是b也不是c,它是其他的东西。因此,我们不能返回对b或c的引用...并且在堆栈上分配新对象时,这将是我们必须使用的唯一两个。因此,我们必须返回一个值。
你已经解释过为什么+ =运算符会返回它的作用。
答案 2 :(得分:1)
因为complex& operator+=(const T& val);
对this
进行操作,并且因为complex operator+(const T& val);
必须为总和创建一个新的临时对象。
如果您要从+=
返回一个对象,它可能按照您的意愿行事,但可能会有一些额外的副本。正如您所提到的,如果您想要链接调用,那么想要这种行为。如果您返回了一个临时文件并写了(a += b) += c
,那么当您在临时文件中销毁时,您添加的c
将会丢失。
如果您要从+
返回引用,则您将引用临时引用,并且您的程序将具有未定义的行为。您可以撰写a=b+c+d
,因为b+c
创建了一个临时b1
而b1 + d
创建了一个临时b2
,然后将其分配给a
。
答案 3 :(得分:1)
在1中,a + = b,+ =运算符修改a。因此,它可以返回对自身的引用,因为它本身就是操作的正确结果。
但是,在2.中需要一个新对象,因为a + b返回的东西不是a,所以返回对a的引用是不正确的。
答案 4 :(得分:0)
在第一种情况下,您正在向左侧的对象添加内容,但表达式的值是左侧的对象。所以你通过引用返回一些东西(通常是左边)。例如:
cout << (a+=b)
在第二种情况下,您要添加两个对象并获取第三个对象,并且可以在堆栈上执行此计算,因此您将按值而不是按引用返回实际对象。 例如:
if(...)
{
T a = b + c;
cout << a;
}