2010-08-19 93 views
1

可能重複:
Overloading += in c++過載+ =運算符如果+過載?

我需要重載+ =運算符,如果我過載+或將編譯器知道該怎麼辦?

謝謝。

+0

如果您爲兩個對象重載+,編譯器**將不會**瞭解有關+ =的任何內容。所以 - 答案是** YES **。 – 2010-08-19 20:35:36

+0

你可能也想重載相關的運算符,比如++和可能的-'s集合。 – 2010-08-19 20:40:08

+1

啊,重複:http://stackoverflow.com/questions/1092331/overloading-in-c。 – GManNickG 2010-08-19 20:40:30

回答

2

您需要重載兩者。

但是,如果順序顛倒,你可以重用代碼:

struct foo 
{ 
    // this is the "core" operation, because it's mutating (changes this) 
    foo& operator+=(const foo&) 
    { 
     // ... 
     return *this; 
    } 

}; 

foo operator+(const foo& lhs, const foo& rhs) 
{ 
    foo ret = lhs; 
    ret += rhs;   
    return ret; 
} 

您進行復印,操作上該副本,並將其返回。

+0

我不相信你最後的陳述是真實的。在'operator +'在函數內部複製副本的情況下總體上會導致更少的副本。規範形式應該(恕我直言)是:'foo operator +(const foo&lhs,const foo&rhs){foo ret(lhs); ret + = rhs;返回ret; ''。 – 2010-08-19 20:46:50

+0

我喜歡Charles的形式建議,因爲它對我來說更清楚。但我相信GMan使用的格式允許編譯器更輕鬆地使用RVO。所以我想我只需要習慣這種新的形式(直到編譯器趕上,然後我可以回到舊的形式)。 – 2010-08-19 20:50:30

+0

我依賴於很多因素,但除非編譯器使用'operator + ='的內部部分(而不是將它用作直接函數調用),否則我的表單將比通過值版本傳遞第一個參數。工作中有幾個因素。首先,從函數簽名中,調用者無法最優地知道它爲參數創建的副本可能是返回值;這是功能內部已知的。其次,雖然'operator + ='返回一個引用,但是簽名本身並不要求這是'* this',即使我們知道它應該是。 – 2010-08-19 20:54:35