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

C++ 類別建構函式完整指南:語法、初始化列表、繼承與 const 成員

     編輯:關於C++

建構函式核心規則

  • 函式名必須與類別名相同。
  • 不得宣告回傳型別 (連 void 也不行)。
  • 可多載 (參數列不同)。
  • 隱含回傳 this 指標 (指向新建物件)。
  • 無參數版稱為預設建構函式。

成員初始化兩種寫法


class F {
    int mx, my, mi, mj;
public:
    F(int x, int y);
};

// 寫法 1:初始化列表 (推薦)
F::F(int x, int y) : mx(x), my(y) {
    mi = 0; mj = 0;  // 指派
}

// 寫法 2:函式本體指派
F::F(int x, int y) {
    mx = x; my = y; mi = 0; mj = 0;
}

初始化列表必須使用的情況

  1. 基類建構:派生類必須在初始化列表呼叫基類建構函式。
    class B : public A {
    public:
        B(int x, int y) : A(x) {}  // 傳遞參數給基類
    };
  2. const 成員:const 資料成員只能在初始化列表初始化,函式本體無法指派。
    class ConstDemo {
        const int id;
    public:
        ConstDemo(int i) : id(i) {}  // 正確
        // ConstDemo(int i) { id = i; } // 編譯錯誤
    };
  3. 參考成員:同 const,必須初始化列表綁定。
  4. 無預設建構函式的成員物件:必須顯式傳參初始化。

初始化順序規則

  1. 基類建構函式 (繼承順序)。
  2. 成員物件建構函式 (宣告順序,非初始化列表書寫順序)。
  3. 派生類建構函式本體。

最佳實務:初始化列表書寫順序與成員宣告順序保持一致,避免隱性順序差異導致難以診斷的 Bug。

建構函式與資源管理 (RAII)


class FileHandle {
    FILE* fp;
public:
    FileHandle(const char* path, const char* mode) : fp(fopen(path, mode)) {
        if (!fp) throw std::runtime_error("Open failed");
    }
    ~FileHandle() { if (fp) fclose(fp); }
    // 禁用拷貝,支援移動
    FileHandle(const FileHandle&) = delete;
    FileHandle& operator=(const FileHandle&) = delete;
    FileHandle(FileHandle&& other) noexcept : fp(other.fp) { other.fp = nullptr; }
};

C++11 委派建構函式


class Date {
    int y, m, d;
public:
    Date(int y, int m, int d) : y(y), m(m), d(d) { validate(); }
    Date() : Date(1970, 1, 1) {}  // 委派給主建構函式
    Date(const std::string& s) : Date() { parse(s); }
};

總結檢查清單

  • [ ] 是否提供預設建構函式 (或刻意刪除)?
  • [ ] 所有 const/參考/無預設建構成員是否在初始化列表初始化?
  • [ ] 基類建構是否正確傳參?
  • [ ] 初始化列表順序是否符合宣告順序?
  • [ ] 資源獲取是否在建構函式 (RAII)?
  • [ ] 異常安全:建構失敗時已獲取資源是否正確釋放?
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved