C++ 通過**後綴形式多一個 int 參數**區分重載:
UPInt& operator++(); // 前綴
const UPInt operator++(int); // 後綴(調用時編譯器傳 0)
// 前綴:增後取
UPInt& UPInt::operator++() { *this += 1; return *this; }
// 後綴:取後增
const UPInt UPInt::operator++(int) {
UPInt oldValue = *this;
++(*this);
return oldValue;
}
後綴參數不用,省略參數名避免警告。
防止 i++++ 合法。若非 const,i.operator++(0).operator++(0) 合法,第二次調用修改的是**臨時對象**而非原對象,導致 i 僅增 1,違背直覺且與內建類型行為不一致。返回 const 使臨時對象無法調用非 const 成員函數,編譯報錯。
後綴**必須構造臨時對象**保存舊值,前綴無此開銷。**用戶定義類型應優先用前綴**,除非確需舊值。
const UPInt UPInt::operator++(int) {
UPInt oldValue = *this;
++(*this); // 調用前綴形式
return oldValue;
}
僅維護前綴邏輯,後綴自動一致,防止多人維護產生分歧。
掌握三點:**正確返回類型**、**後綴委託前綴**、**優先用前綴**——即能正確高效重載增減運算符。