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