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

高品質 C++/C 程式設計指南 第 9 章 (一):建構/解構/賦值——看似簡單實則危險的三大基石

     編輯:關於C++

每個類別的三大基本函數

  • 解構函數:唯一
  • 賦值運算子:唯一
  • 建構函數:可多個 (含一個拷貝建構函數)

若程式設計師不寫,編譯器**自動合成四個預設版本**:

A();                    // 預設建構
A(const A&);            // 預設拷貝建構 (位元拷貝)
~A();                   // 預設解構
A& operator=(const A&); // 預設賦值 (位元拷貝)

為何不能偷懶用預設版本?

  1. 預設建構/解構 = 放棄「初始化」與「清理」自主權,Stroustrup 的良苦用心白費。
  2. 預設拷貝/賦值 = **位元拷貝 (淺拷貝)**。類別若含指標,**註定出錯** (雙重釋放、懸空指標、資料競爭)。
若程式設計師說「寫這三個函數很簡單、不用動腦」,**認識仍淺、水平待提高**。這是無數前輩用血淚換來的教訓。

案例類別:String 設計藍圖

class String {
public:
    String(const char* str = nullptr);     // 普通建構
    String(const String& other);           // 拷貝建構
    ~String();                             // 解構
    String& operator=(const String& other); // 賦值
private:
    char* m_data; // 動態字串緩衝區
};

本章將以此類為例,深入剖析教科書常忽略的關鍵細節。

9.1 起源:Stroustrup 的安全設計哲學

  • C++ 編譯器嚴格型別檢查捕獲語法錯誤 (小弟級)。
  • 高階錯誤 (邏輯、資源、併發) 隱藏極深,**多源於「忘記初始化」或「忘記清理」**。
  • Stroustrup 方案:**建構函數自動執行初始化,解構函數自動執行清理**。物件生而初始化、亡而清理,杜絕人為遺忘。

命名規則

  • 建構函數 = 類別名 (同名)。
  • 解構函數 = ~ + 類別名 (前綴區分,目的相反)。
  • **無返回型別** (非 void) —— 使命單純:生與死,輕裝上陣。
參考文獻:Thinking in C++ (Eckel) pp.55-56
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved