C ++中的运算符的返回类型是什么?

时间:2012-05-04 02:01:37

标签: c++ operator-overloading

我正在阅读C ++ Primer,在重载操作章节中,作者举了一个例子:

// member binary operator: left-hand operand bound to implicit this pointer
Sales_item& Sales_item::operator+=(const Sales_item&);
// nonmember binary operator: must declare a parameter for each operand
Sales_item operator+(const Sales_item&, const Sales_item&);
然后,作者解释说:

  

当应用于算术类型时,此差异与这些运算符的返回类型相匹配:加法产生右值,复合赋值返回对左侧操作数的引用。

我不太确定“compound assignment returns a reference to the left-hand operand”。有人可以详细说明这个问题吗?

2 个答案:

答案 0 :(得分:5)

这意味着您可以执行以下操作

a = 1; 
(a += 1) += 1;

,结果将是== 3.这是因为最左边的调用+ =修改a然后  返回对它的引用。然后下一个+ =对a的引用进行操作,并再次为其添加一个数字。

另一方面,normal +运算符返回结果的副本,而不是对其中一个参数的引用。所以这意味着像a + a = 3;这样的表达式是非法的。

答案 1 :(得分:2)

a = a + b;

也是

a += b;

相当于

a.operator+= (b)

operator + =支持复合赋值:

(a += b) += c;

相当于

a.operator+= (b).operator+= (c);

如果返回的值而不是右值,则无法使用最后一行。

请考虑以下事项:

c = a + b;

也是

c = a.operator+ (b);

a.operator+ (b) = c;

没有效果,因为a的值没有改变。