6

我在看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”。谁能详细说明一下,以及相关的事情,好吗?

4

2 回答 2

5

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

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

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

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

于 2012-05-04T02:08:02.087 回答
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 的值没有改变。

于 2012-05-04T02:09:03.310 回答