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

C++ 運算符重載完全指南:可重載列表、實現規範與最佳實踐

     編輯:C++ 入門

C++ 運算符重載完全指南

運算符重載讓自定義類型像內置類型一樣自然使用。C++98/11/17 規定相同,大多數運算符可重載,少數不可。

可重載與不可重載運算符

可重載不可重載
+ - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= <<= >>= == != <= >= && || ++ -- , ->* -> () [] new delete new[] delete[]:: (作用域) . (成員訪問) .* (成員指針訪問) ?: (三目) sizeof alignof typeid

注意:.、.*、::、?: 語法內建,不可重載。->、()、[]、= 必須作為成員函數重載;其餘可作為友元或普通函數。

重載規則與注意事項

  • 不改變運算符優先級、結合性、操作數個數(如 + 必須雙目)。
  • 至少一個操作數為自定義類型(防止改變內置類型行為)。
  • 前置 ++/-- 返回引用,後置返回舊值副本(參數 int 佔位)。
  • 賦值運算符= 必須為成員函數,返回 *this 引用,處理自賦值。
  • 邏輯運算符 &&、|| 重載後失去短路求值特性,慎用。
  • 取地址 &、逗號 、重載後語義改變,極少使用。

實戰範例:模擬整型 Integer

class Integer {
    int val;
public:
    Integer(int v=0): val(v) {}
    // 算術
    Integer operator+() const { return *this; }
    Integer operator-() const { return Integer(-val); }
    Integer operator+(const Integer& r) const { return Integer(val + r.val); }
    // ... -, *, /, % 同理
    // 自增自減
    Integer& operator++() { ++val; return *this; } // 前置
    Integer operator++(int) { Integer t=*this; ++val; return t; } // 後置
    // 比較
    bool operator==(const Integer& r) const { return val == r.val; }
    bool operator<(const Integer& r) const { return val < r.val; }
    // ... >, !=, <=, >= 可用 == 和 < 合成
    // 位運算
    Integer operator~() const { return Integer(~val); }
    Integer operator<<(int n) const { return Integer(val << n); }
    // ... >>, &, |, ^ 同理
    // 賦值與復合賦值
    Integer& operator=(const Integer& r) { val = r.val; return *this; }
    Integer& operator+=(const Integer& r) { val += r.val; return *this; }
    // ... -=, *=, /=, %=, &=, |=, ^=, <<=, >>= 同理
    // 轉換函數
    operator int() const { return val; }
};

模擬指針 Pointer

template 
class Pointer {
    T* ptr;
public:
    Pointer(T* p=0): ptr(p) {}
    T& operator*() const { return *ptr; }
    T* operator->() const { return ptr; }
    T& operator[](int i) const { return ptr[i]; }
    Pointer& operator++() { ++ptr; return *this; }
    Pointer operator++(int) { Pointer t=*this; ++ptr; return t; }
    Pointer& operator+=(int n) { ptr += n; return *this; }
    Pointer operator+(int n) const { return Pointer(ptr + n); }
    // ... -, -= 同理
};

Placement New/Delete 配對原則

若提供 void* operator new(size_t, Args...),必須提供對應 void operator delete(void*, Args...),否則構造函數拋異常時內存洩漏。並用基類 StandardNewDeleteForms 保留標準 new/delete 避免被遮蔽。

總結

運算符重載核心是「保持直觀語義」。遵循標準庫慣例(如流輸出 operator<<、比較 operator<、智能指針 operator*/->),代碼才易讀、易維護。

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