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