運算子過載
無法更改內建型別的運算子,只能為使用者定義的型別過載運算子。也就是說,至少一個運算元必須是使用者定義的型別。
以下運算子不能過載:
- 成員訪問或點運算子 .
- 指向成員訪問運算子 .*的指標
- 範圍解析運算子::
- 三元條件運算子 ?:
- dynamic_cast,- static_cast,- reinterpret_cast,- const_cast,- typeid,- sizeof,- alignof,和- noexcept
- 預處理指令 #和##,它們在任何型別資訊可用之前執行。
有些運算子不應該 (99.98%的情況下)超載:
- &&和- ||(相反,更喜歡使用隱式轉換為- bool)
- ,
- 運算子地址(一元 &)
為什麼?因為它們使另一個程式設計師可能永遠不會想到的運算子超載,導致行為與預期不同。
例如,使用者定義的這些運算子的 && 和||過載會丟失其短路評估並失去其特殊的排序屬性(C++ 17) ,排序問題也適用於 , 運算子過載。