我正在阅读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
”。有人可以详细说明这个问题吗?
答案 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的值没有改变。