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

高品質 C++/C 程式設計指南 第 9 章 (四):賦值運算子的四步實現與偷懶封鎖法

     編輯:關於C++

String 賦值運算子:四步走戰略

String& String::operator=(const String& other) {
    // (1) 自賦值檢查
    if (this == &other) return *this;

    // (2) 釋放舊資源
    delete [] m_data;

    // (3) 分配新記憶體並複製內容
    int len = strlen(other.m_data);
    m_data = new char[len + 1];
    strcpy(m_data, other.m_data);

    // (4) 返回 *this 支援鏈式賦值
    return *this;
}

關鍵細節深度解析

  1. 自賦值檢查:不只是 a = a,間接自賦值 b=a; c=b; a=c; 或 b=&a; a=*b; 同樣致命。
    若跳過檢查直接 delete → 物件自殺後無法複製自己。
  2. 釋放舊記憶體:不釋放 = 記憶體洩漏,且無第二次機會。
  3. 分配與複製:strlen 不含 \0,strcpy 含 \0,故分配 len+1。
  4. 返回 *this 而非 this 或 other:
    • return this → 型別錯誤 (指標 vs 參考)。
    • return other → 危險!other 可能是臨時物件,賦值結束即銷毀,返回懸空參考。

9.7 偷懶封鎖法:私有化拷貝建構與賦值

若類別**不應被複製**(如獨佔資源、單例、IO 通道),只需宣告為 private **且不實作**:

class A {
private:
    A(const A&);             // 未定義
    A& operator=(const A&);  // 未定義
};

任何嘗試複製/賦值的代碼將**編譯報錯** (存取 private),完美封鎖編譯器預設的淺拷貝。C++11 後可用 = delete 更明確。

9.8 派生類實作基類基本函數規範

  • 建構函數:初始化列表中**顯式呼叫基類建構函數**。
  • 解構函數:基類與派生類解構函數**必須宣告為 virtual**,確保多態刪除正確調用派生類解構函數。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved