賦予現有運算符(+, -, *, ==...)新含義,使其能操作用戶自定義類型,實現多態。編譯器根據操作數類型決議調用哪個重載版本。
返回類型 operator運算符(參數列表) { ... }
// 成員函數形式(隱含 this)
Complex operator+(const Complex& rhs) const;
// 非成員函數形式(需 friend 或公開接口)
Complex operator+(const Complex& lhs, const Complex& rhs);
class Complex {
double re, im;
public:
Complex(double r=0, double i=0) : re(r), im(i) {}
Complex operator+(const Complex& o) const { return Complex(re+o.re, im+o.im); }
Complex operator-(const Complex& o) const { return Complex(re-o.re, im-o.im); }
Complex& operator+=(const Complex& o) { re+=o.re; im+=o.im; return *this; }
bool operator==(const Complex& o) const { return re==o.re && im==o.im; }
void print() const { cout << '(' << re << ',' << im << 'i)'; }
};
// 非成員重載:支持 double + Complex
Complex operator+(double d, const Complex& c) { return Complex(d+c.re, c.im); }
| 運算符 | 建議形式 | 備註 |
|---|---|---|
單目 + - * & ++ -- | 成員函數 | 前置返回引用,後置返回值 |
二元算術 + - * / % | 非成員 friend | 支持隱式轉換(如 double+Complex),利用 += 實現 |
比較 == != < > | 非成員 friend | 對稱性 |
賦值 = += -= | 成員函數 | 返回 *this 引用 |
下標 [] | 成員函數 | 提供 const/非 const 版本 |
函數調用 () | 成員函數 | 仿函數 |
類型轉換 operator T() | 成員函數 | 慎用,隱式轉換易驚喜 |
ostream& operator<<(ostream&, const T&):非成員 friend,鏈式輸出返回流引用。istream& operator>>(istream&, T&):同理。*, ->, ++, --, +, -, [] 全部重載,模擬指針行為。operator*, operator->, operator bool() (explicit)。const;參數用 const&。T& operator++(),後置 T operator++(int)(int 佔位符)。&& || ,:會失去短路求值特性,改為函數名。add())更清晰。運算符重載是 C++ 讓用戶定義類型「像內置類型一樣自然使用」的關鍵機制,配合模板與標準庫,構建了現代 C++ 表達力的核心基礎。