即使我們已經超載了+
和=
運算符,是否有必要過載運算符+=
?超載複合賦值運算符
回答
您打算使用+=
運算符嗎?如果是,那麼是的,你應該超載它。
即使過載了operator+
和賦值運算符,編譯器也不會自動創建一個。你可以相互實施它們,但都需要實施。一般而言,添加和分配與複合賦值完成相同的功能,但情況並非總是如此。
一般情況下,超載的算術運算符時(+
,-
等),你應該做他們與他們相關的複合賦值以及(+=
,-=
等)。
有關某些規範實現的cppreference,請參閱"Binary arithmetic operators"。
class X { public: X& operator+=(const X& rhs) // compound assignment (does not need to be a member, { // but often is, to modify the private members) /* addition of rhs to *this takes place here */ return *this; // return the result by reference } // friends defined inside class body are inline and are hidden from non-ADL lookup friend X operator+(X lhs, // passing lhs by value helps optimize chained a+b+c const X& rhs) // otherwise, both parameters may be const references { lhs += rhs; // reuse compound assignment return lhs; // return the result by value (uses move constructor) } };
這SO Q&A了一些基本的規則超載。
是的,在總體上是一個好主意,提供內建類型(如int
)時實現運算符重載,以避免混淆相同的行爲。
並且沒有operator+=
,您必須使用operator+
和operator=
來做同樣的事情。即使使用RVO,也會再次應用副本。
如果您決定實施operator+=
,最好使用它來實現operator+
的一致性。
謝謝你的回答@songyuanyao – Walidix
@WalidSalhi不客氣。 – songyuanyao
- 1. 運算符超載賦值運算符
- 2. 賦值=運算符超載
- 3. 複合賦值運算符重載
- 4. java複合賦值運算符和賦值運算符
- 5. MATLAB - 超載賦值運算符
- 6. 混合賦值和複合賦值運算符 - 優先級?
- 7. 重載複製賦值運算符
- 8. 重載賦值運算符
- 9. 重載賦值運算符
- 10. 移動賦值運算符VS拷貝賦值運算符
- 11. 模板類的超載賦值運算符
- 12. 在C++中重載賦值運算符
- 13. TypeScript中的賦值運算符重載
- 14. C++重載賦值運算符
- 15. C++賦值運算符重載
- 16. 重載賦值運算符標操作
- 17. 重載賦值運算符C++
- 18. 重載C++賦值運算符
- 19. 運算符在枚舉上爲組合賦值運算符重載
- 20. 運算符重載如何爲賦值運算符工作?
- 21. 賦值運算符 - 自賦值
- 22. Java複合賦值表達式中的運算符優先級
- 23. 複合賦值運算符可以短路
- 24. 運算符超載[]
- 25. 運算符超載
- 26. 運算符==超載
- 27. 運算符+超載
- 28. 運算符超載
- 29. 運算符超載
- 30. 關於複製構造函數和重載賦值運算符
做加法然後賦值與'+ ='不是一回事。然後最終的結果*可能*是相同的,但不同的事情正在發生。如果任何重載操作符有副作用(有意或無意),這一點尤其重要。 –
謝謝@JoachimPileborg – Walidix