回答
您需要重載兩者。
但是,如果順序顛倒,你可以重用代碼:
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;
}
您進行復印,操作上該副本,並將其返回。
我不相信你最後的陳述是真實的。在'operator +'在函數內部複製副本的情況下總體上會導致更少的副本。規範形式應該(恕我直言)是:'foo operator +(const foo&lhs,const foo&rhs){foo ret(lhs); ret + = rhs;返回ret; ''。 – 2010-08-19 20:46:50
我喜歡Charles的形式建議,因爲它對我來說更清楚。但我相信GMan使用的格式允許編譯器更輕鬆地使用RVO。所以我想我只需要習慣這種新的形式(直到編譯器趕上,然後我可以回到舊的形式)。 – 2010-08-19 20:50:30
我依賴於很多因素,但除非編譯器使用'operator + ='的內部部分(而不是將它用作直接函數調用),否則我的表單將比通過值版本傳遞第一個參數。工作中有幾個因素。首先,從函數簽名中,調用者無法最優地知道它爲參數創建的副本可能是返回值;這是功能內部已知的。其次,雖然'operator + ='返回一個引用,但是簽名本身並不要求這是'* this',即使我們知道它應該是。 – 2010-08-19 20:54:35
- 1. []運算符的運算符過載
- 2. 運算符過載問題
- 3. 「運算符[]'」的模糊過載如果轉換運算符到int存在
- 4. find()相等運算符過載
- 5. 模板運算符模糊過載
- 6. C#移位運算符過載
- 7. C++過載映射[]運算符
- 8. AS3中的過載[]運算符
- 9. C++/CLI運算符=過載基準
- 10. C++模糊運算符過載錯誤
- 11. 邏輯比較==運算符過載
- 12. 錯誤的運算符()過載調用
- 13. 瞭解C++中的運算符過載
- 14. perl - 通用運算符過載
- 15. C++過載運算符%兩個雙打
- 16. C++/g ++過載增量運算符
- 17. C++輸出運算符過載
- 18. C++轉換運算符過載
- 19. 如何過載運算符矩陣運算使用VB.net編碼
- 20. 從模板類繼承運算符重載。曖昧過載「運算符*」
- 21. 運算符重載 - 重載*
- 22. 如何超載運算符+
- 23. 如何重載運算符[] []
- 24. 重載運算符*
- 25. 重載運算符%
- 26. 運算符超載
- 27. 運算符超載[]
- 28. 運算符==超載
- 29. 重載++運算符
- 30. 重載+ =運算符
如果您爲兩個對象重載+,編譯器**將不會**瞭解有關+ =的任何內容。所以 - 答案是** YES **。 – 2010-08-19 20:35:36
你可能也想重載相關的運算符,比如++和可能的-'s集合。 – 2010-08-19 20:40:08
啊,重複:http://stackoverflow.com/questions/1092331/overloading-in-c。 – GManNickG 2010-08-19 20:40:30