| 運算子類別 | 回傳類型 | 理由 | 範例 |
算術/邏輯/位元 (雙目) + - * / % & | ^ == != < > <= >= && || | 值 (Type) | 產生新物件,不修改運算元;回傳引用會導致懸空 | Complex operator+(const Complex&, const Complex&) |
複合賦值 += -= *= /= %= &= |= ^= <<= >>= | 左值引用 (Type&) | 修改左運算元並返回自身,支援鏈式 a += b += c | Complex& operator+=(const Complex&) |
前綴遞增/遞減 ++ -- | 左值引用 (Type&) | 修改自身並返回自身,支援 ++(++a) | Test& operator++() |
後綴遞增/遞減 ++ -- | 值 (Type) | 返回修改前的副本,不可作左值 | Test operator++(int) |
賦值 = | 左值引用 (Type&) | 支援鏈式賦值 a = b = c | Test& operator=(const Test&) |
下標 [] | 左值引用 (T&) / const T& | 支援 arr[i] = val 左值賦值 | int& operator[](size_t) |
解引用 *, 成員存取 -> | 引用/指標 | 模擬指標語義 | T& operator*(), T* operator->() |
輸出 << | std::ostream& | 支援鏈式 cout << a << b | friend ostream& operator<<(ostream&, const Test&) |
不可多載運算子
. (成員存取)、.* (成員指標存取)、:: (作用域解析)、?: (三元條件)、sizeof、typeid、alignof、new/delete (可多載但特殊)、->* (C++11 起可多載)。
優先級與結合性不變
多載**不改變**運算子優先級與結合性。a + b * c 仍先算 * 再 +,無論 operator+/operator* 如何定義。
最佳實踐
- 語義一致:
+ 要交換律、結合律,== 要等價關係(自反、對稱、傳遞)。
- 成對實作:
== 配 !=,< 配 > <= >=,+ 配 +=。
- 避免驚奇:
operator&&/|| 失去短路求值,**極不建議多載**。
- 輸出運算子:必須為友元/非成員,第一參數
ostream&,返回 ostream&。
- 轉型運算子:
explicit operator bool() (C++11) 防止隱式轉 int 參與算術。
總結
運算子多載威力巨大,核心在於**回傳值語義正確**(值 vs 引用)、**形式選擇得當**(友元 vs 成員)、**語義符合直覺**。遵循標準庫慣例(std::string, std::vector, std::complex),你的類型就能像內建型別一樣自然運算。
- 上一篇文章: API Hook 基本原理與實現:從訊息鉤子到 API 重導向
- 下一篇文章: C++ 善用建構函式與無名物件簡化運算子多載:對稱性與效能雙贏
Copyright ©
程式碼之家 All Rights Reserved