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

C++ Primer 學習筆記:運算符重載——輸入輸出、算術、關系運算符

     編輯:C++ 入門

運算符重載分類

  • 輸入/輸出運算符:`operator<<`、`operator>>`(必須為非成員函數/友元)
  • 算術運算符:`+ - * / %` 等(建議非成員,支持隱式轉換)
  • 關系運算符:`== != < <= > >=`(建議非成員,保持對稱性)
  • 賦值/複合賦值:`= += -=` 等(必須為成員函數)
  • 下標/調用/解引用:`[] () * ->`(必須為成員)

輸入/輸出運算符重載

class Date {
    int y, m, d;
    friend ostream& operator<<(ostream& os, const Date& dt);
    friend istream& operator>>(istream& is, Date& dt);
};

ostream& operator<<(ostream& os, const Date& dt) {
    return os << dt.y << '-' << dt.m << '-' << dt.d;
}

istream& operator>>(istream& is, Date& dt) {
    char c;
    return is >> dt.y >> c >> dt.m >> c >> dt.d;
}

關鍵點

  • 返回流引用,支持鏈式調用 `cout << a << b`
  • 輸入運算符參數為非 const 引用(需修改對象)
  • 處理格式錯誤時設置 `is.setstate(ios::failbit)`

算術運算符重載

class Complex {
    double re, im;
public:
    friend Complex operator+(const Complex& a, const Complex& b) {
        return {a.re + b.re, a.im + b.im};
    }
    friend Complex operator-(const Complex& a, const Complex& b) {
        return {a.re - b.re, a.im - b.im};
    }
    // 複合賦值作為成員
    Complex& operator+=(const Complex& rhs) {
        re += rhs.re; im += rhs.im; return *this;
    }
    // + 利用 += 實現
    friend Complex operator+(Complex lhs, const Complex& rhs) {
        return lhs += rhs;
    }
};

最佳實踐

  • 複合賦值 (`+=`) 作為成員,返回 `*this`
  • 普通算術 (`+`) 作為非成員,參數傳值利用複製構造,調用 `+=`
  • 支持混合類型運算(如 `Complex + double`)

關系運算符重載

class Date {
    int y, m, d;
public:
    friend bool operator==(const Date& a, const Date& b) {
        return a.y==b.y && a.m==b.m && a.d==b.d;
    }
    friend bool operator<(const Date& a, const Date& b) {
        if (a.y != b.y) return a.y < b.y;
        if (a.m != b.m) return a.m < b.m;
        return a.d < b.d;
    }
    // C++20 可用 <=> 自動生成其餘
};

C++20 三向比較

// C++20
#include <compare>
class Date {
    int y, m, d;
public:
    auto operator<=>(const Date&) const = default; // 自動生成 ==, !=, <, <=, >, >=
};

重載規則總結表

運算符成員/非成員備註
= [] () ->必須為成員
<< >>必須為非成員左操作數是流
+ - * / % ^ & | ~ !建議非成員支持隱式轉換
== != < <= > >=建議非成員保持對稱性
+= -= *= ...建議成員修改左操作數
++ --成員前置返回引用,後置返回值

避坑指南

  1. 不要重載 `&&` `||` `,`(會失去短路求值/順序點語義)
  2. 避免重載 `new`/`delete` 除非自定義內存管理
  3. 運算符語義應與內建類型一致,不可濫用
  4. 標記 `noexcept` 提升性能(移動語義、交換等)

運算符重載是 C++ 表達能力的核心,遵循「語義一致、對稱性、最小驚訝原則」,能讓自定義類型像內建類型一樣自然易用。

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