为什么定义operator +调用operator + =而不是相反的方式更有效?

时间:2014-01-12 04:01:50

标签: c++ operator-overloading

这是 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),作者给出了一个提示

  

定义算术运算符和相关运算符的类   复合赋值通常应该实现算术   运算符使用复合赋值。

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

2 个答案:

答案 0 :(得分:5)

operator+=如果使用operator+实现,则会使用不必要的临时对象,如operator+示例的第一行所示。

答案 1 :(得分:4)

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

如果您想根据二元运算符实现复合运算符,则操作顺序如下:

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

如果你反过来这样做,最后一个副本就被删除了:

  • 二元运算符创建一个表示左侧对象的总和的对象
  • 二元运算符调用复合添加分配,不需要复制
  • 二元运算符按值返回对象(副本#2)

因此,在二进制+的实现中使用复合加法赋值更有效。