这是 C ++ Primer 5th Edition 的练习:
练习14.14:为什么你认为定义更有效 operator +调用operator + =而不是相反?(P.561)
鉴于operator+=
和operator+
的实施:
Sales_data&
Sales_data::operator+=(const Sales_data &rhs)
{
units_sold += rhs.units_sold;
revenue += rhs.revenue;
return *this;
}
Sales_data
operator+(const Sales_data &lhs, const Sales_data &rhs)
{
Sales_data sum = lhs; // copy data members from lhs into sum
sum += rhs; // add rhs into sum
return sum;
}
在本节末尾(14.3),作者给出了一个提示
定义算术运算符和相关运算符的类 复合赋值通常应该实现算术 运算符使用复合赋值。
任何人都可以使用事实/例子解释这个提示吗?
答案 0 :(得分:5)
operator+=
如果使用operator+
实现,则会使用不必要的临时对象,如operator+
示例的第一行所示。
答案 1 :(得分:4)
原因在于需要进行的复制次数:二元运算符+
创建并返回表示和的新对象,而复合加法赋值运算符则修改对象。
如果您想根据二元运算符实现复合运算符,则操作顺序如下:
如果你反过来这样做,最后一个副本就被删除了:
因此,在二进制+
的实现中使用复合加法赋值更有效。