首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 基礎

C++ 運算符重載規則全解析:可重載清單、限制與成員/全域選擇策略

     編輯:C++ 基礎

可重載運算符完整清單

以下運算符可重載:

+  -  *  /  %  ^  &  |  ~  !  =  <  >  +=  -=  *=  /=  %=  ^=  &=  |=
<<  >>  <<=  >>=  ==  !=  <=  >=  &&  ||  ++  --  ,  ->*  ->  ()  []
new  new[]  delete  delete[]

不可重載(5 個):

  • sizeof - 長度運算符
  • ?: - 條件運算符
  • . - 成員選擇運算符
  • .* - 成員指針選擇運算符
  • :: - 域解析運算符

六大核心限制規則

#規則說明
1不改變優先級與結合性c1 + c2 * c3 仍先算乘法,同內建型別
2不改變操作數個數/位置一元仍一元,二元仍二元,左/右操作數位置固定
3不可有預設參數否則改變操作數個數,違反運算符語義
4不可為內建型別重新定義int operator+(int,int) 非法,防止 4+3 語義混亂
5至少一個操作數為用戶定義型別全域函數重載時強制要求,區分自定義與內建
6特定運算符只能作成員函數= [] () -> 四大運算符限定為成員

成員函數 vs 全域函數:參數差異

成員函數範例

class Complex {
    Complex operator+(const Complex& rhs) const;  // 只需右操作數
};
// c3 = c1 + c2  →  c3 = c1.operator+(c2);  // this=c1

全域函數範例

Complex operator+(const Complex& lhs, const Complex& rhs);  // 需雙參數
// c3 = c1 + c2  →  c3 = operator+(c1, c2);

選擇策略:何時用哪種形式?

形式一元運算符二元運算符隱含參數
成員函數0 參數1 參數this 指針
全域函數1 參數2 參數無
場景推薦形式理由
= [] () ->成員函數語法強制要求
對稱運算符 (+ - * / == !=)全域函數左右操作數地位對等,支援隱式轉換
修改左操作數 (+= -= *=)成員函數自然表達 this 修改
左操作數非類型 (ostream<<)全域函數無法修改標準庫類
類型轉換運算符成員函數只能為成員

全域函數通常需友元聲明

因需訪問 private/protected 成員:

class Complex {
    friend Complex operator+(const Complex&, const Complex&);
    friend ostream& operator<<(ostream&, const Complex&);
    // ...
};

經典錯誤示範

// 錯誤:嘗試重載內建型別運算符
int operator+(int a, int b) { return a - b; }  // 編譯錯誤!

// 錯誤:改變操作數個數
Complex operator+(Complex a, Complex b, Complex c);  // 三元+ 非法

// 錯誤:預設參數
Complex operator+(Complex a, Complex b = Complex());  // 非法

總結

運算符重載雖強大,但受嚴格規則約束。核心原則:保持語義直觀、不破壞內建行為、正確選擇成員/全域形式。掌握可重載清單、六大限制、參數差異與選擇策略,才能編寫符合 C++ 慣用法、不驚訝用戶的運算符重載代碼。

  1. 上一篇文章:
  2. 下一篇文章:
  • --热点文章
  • Copyright © 程式碼之家 All Rights Reserved