前置 ++i 與後置 i++ 是 C++ 新手常混淆的概念,但其效率與語義差異在迭代器、運算子多載場景至關重要。
// 前置:無參數,回傳引用
Type& operator++();
// 後置:帶 int 偽參數,回傳 const 值
const Type operator++(int);
int 參數無實際意義,純粹作為標記讓編譯器區分兩者。調用時編譯器自動傳入 0。
class CInt {
int m_value;
public:
// 前置 ++:修改自身,回傳 *this 參考
CInt& operator++() {
m_value += 1;
return *this;
}
// 後置 ++:建立舊值副本,遞增自身,回傳副本
const CInt operator++(int) {
CInt old = *this; // 複製構造
++(*this); // 呼叫前置版本
return old; // 回傳舊值副本
}
};
| 特性 | 前置 ++ | 後置 ++ |
|---|---|---|
| 效率 | 高:無額外構造/複製 | 低:需構造臨時物件 |
| 回傳型別 | Type&(左值) | const Type(右值) |
| 連續操作 | 支援 (++it)->func() | 禁止修改回傳的臨時物件 |
(++it)->func()。const 引用/值,使用者可能誤以為修改回傳值能影響原物件,實則修改的是即將銷毀的臨時物件——極易產生邏輯錯誤。const Type&:臨時物件在完整表達式結束時銷毀,回傳懸空引用導致未定義行為。int 不支援 i++++,回傳 const 值禁止鏈式修改,行為一致。arr[i++] = val)。掌握此差異,不僅能寫出高效代碼,更能深入理解 C++ 物件模型與運算子多載設計哲學。