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

Yue*_*ang 5 c++ operator-overloading

这是C++ Primer第5版的练习:

练习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;
}
Run Code Online (Sandbox Code Playgroud)

在本节末尾(14.3),作者给出了一个提示

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

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

das*_*ght 6

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

如果要使用二进制运算符来实现复合运算符,则操作序列如下:

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

如果您反过来做,则最后一个副本将被消除:

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

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


Mat*_*ert 5

operator+=如果它是使用实现的operator+,将使用不必要的临时对象,如您在operator+示例的第一行中所示.