2014-01-12 75 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在執行二進制+是更有效率。

相關問題