2014-01-12 48 views
4

这是一个从℃的运动++入门第五版为什么定义operator +来调用operator + =而不是其他方法更有效?

练习14.14:为什么你认为它是更有效地定义 运营商+来调用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)电子端,作者给出一个提示,

类定义两个算术运算符和相关 化合物分配通常应该使用化合物分配到执行算术 操作者。

任何人都可以解释这个提示,使用事实/例子吗?

+1

通常'operator +'返回一个新值,其中'operator + ='修改一个对象。毕竟,你不希望'a + b + c'中的'a'或'b'改变。这意味着'+ ='使用临时值。然而,如果你有'+ =',你可以简单地在你的'operator +'中通过值而不是参考来获取第一个参数,并且使你的函数非常小:'return left_hand_side + = right_hand_side;'。 – Zeta

回答

4

operator+=将使用不必要的临时对象,如果它使用operator+实现的,您可以在operator+示例的第一行看到。

3

原因在于需要进行复制的次数:二元运算符+创建并返回表示总和的新对象,而复合加法赋值运算符则修改了该对象。

如果你想实现的复合运算符的二元运算方面,动作的顺序是如下:

  • 复合赋值调用二进制运算
  • 二元运算符创建一个新的(复制#1)中的一个对象,并将总和放入其中
  • 总和由值(副本#2)返回
  • 将总和对象复制到左侧对象(拷贝#3)

如果你身边做它的其他方式,最后一个副本被消除:

  • 二元运算创建表示从左侧对象总和的对象
  • 二元运算符调用时加入化合物-assignment,其不需要复制
  • 二进制操作者通过值返回对象(复制#2)

因此,使用化合物加成assignm在执行二进制+是更有效率。

相关问题