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

C++ 指派運算子完整實作指南:Copy-and-Swap 慣用語、自我指派檢查與強烈異常安全

     編輯:C++ 入門

指派運算子(operator=)是 C++ 類別資源管理的核心,正確實作需處理自我指派、資源釋放、異常安全、高效交換。本文透過 Book 類別完整範例,深度解析 Copy-and-Swap 慣用語、std::swap 非擲出交換、強烈異常安全保證、拷貝建構函式與指派運算子關係,提供工程級可複製類別實作範本。

Book 類別完整實作


class Book {
    char *name;
    char *author;
    double price;

    // 私有交換函式:非擲出、高效
    Book& swap(Book& rhs) {
        std::swap(name, rhs.name);
        std::swap(author, rhs.author);
        std::swap(price, rhs.price);
        return *this;
    }

public:
    // 建構函式
    Book(const char *n, const char *a, double p) : price(p) {
        name = new char[strlen(n) + 1];
        author = new char[strlen(a) + 1];
        strcpy(name, n);
        strcpy(author, a);
    }

    // 拷貝建構函式
    Book(const Book& b) : price(b.price) {
        name = new char[strlen(b.name) + 1];
        author = new char[strlen(b.author) + 1];
        strcpy(name, b.name);
        strcpy(author, b.author);
    }

    // 指派運算子:Copy-and-Swap
    Book& operator=(const Book& rhs) {
        Book(rhs).swap(*this);  // 1. 拷貝建構臨時物件 2. 交換資源 3. 臨時物件析構釋放舊資源
        return *this;
    }

    // 解構函式
    ~Book() {
        delete[] name;
        delete[] author;
    }
};

Copy-and-Swap 三步驟機制

  1. 拷貝建構臨時物件:Book(rhs) 使用拷貝建構函式,可能拋出異常(記憶體不足),但原物件 *this 未被修改
  2. 交換資源:swap(*this) 使用 std::swap 交換指標/值,非擲出保證
  3. 臨時物件析構:離開作用域時,臨時物件持有原 *this 的舊資源,析構函式釋放

核心優勢

關鍵實作細節

  1. swap 必須 非擲出:僅交換指標/基本型別,使用 std::swap(C++11 起 noexcept)
  2. swap 為 私有成員函式:非介面操作,內部實作細節
  3. 拷貝建構函式必須正確:深度複製所有資源
  4. 解構函式必須正確:釋放所有資源

現代 C++ 補充:移動指派 (C++11)


Book& operator=(Book&& rhs) noexcept {
    swap(rhs);  // 直接交換,rhs 析構釋放舊資源
    return *this;
}

移動指派與 Copy-and-Swap 共享 swap 實作,實現零開銷資源轉移。

測試驗證


Book a("C++ Primer", "Lippman", 98);
Book b = a;      // 拷貝建構
Book c("Effective C++", "Meyers", 88);
c = a;           // 指派運算子
// a、b、c 內容一致,資源獨立

總結

Copy-and-Swap 是實作指派運算子的黃金標準:強烈異常安全、自動處理自我指派、複用拷貝建構/解構、O(1) 交換效能。配合私有非擲出 swap、正確拷貝建構/解構、移動指派複用,構成現代 C++ 可複製/可移動類別的完整資源管理框架。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性傳統實作Copy-and-Swap
自我指派需額外 if (this == &rhs)自動處理(拷貝自己再交換無害)
異常安全基本保證(可能資源洩漏/狀態損壞)強烈保證(失敗不修改 *this)
程式碼重用建構/指派/解構邏輯分散複用拷貝建構+解構
效能釋放再分配交換指標 O(1)