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

C++ 學習筆記(二):建構函數與解構函數詳解

     編輯:VC 教學

1. 建構函數

建構函數是類的特殊成員函數,名稱與類同名。當定義該類物件時,編譯器自動呼叫以完成初始化。

  • 無返回值型別(甚至不能寫 void)。
  • 可定義在類內或類外(使用作用域解析運算子 ::)。
  • 可多載:參數個數、型別不同構成重載,編譯器依實參選擇合適版本。
  • 不可直接呼叫,僅在物件建立時由系統隱式調用。

語法

ClassName(參數列表) {
    // 初始化程式碼
}

2. 建構函數重載

同一類中定義多個同名建構函數,參數列表須不同。常見模式:

  • 預設建構函數(無參數)
  • 帶參數建構函數
  • 拷貝建構函數

3. 預設建構函數與缺省參數

  • 若類未顯式定義任何建構函數,編譯器生成一個內建預設建構函數(無參數、函數體為空),僅配置記憶體,不初始化資料成員。
  • 一旦定義了任一建構函數,編譯器不再生成預設版本。
  • 良好習慣:永遠提供完成有意義初始化的建構函數。
  • 缺省參數建構函數:參數帶預設值,等同於多載。注意避免二義性(如 ClassName(int=0) 與 ClassName() 同時存在會衝突)。

4. 拷貝建構函數

用一個同類物件初始化另一個物件。格式:

ClassName::ClassName(const ClassName &obj) {
    // 逐成員拷貝或深拷貝
}
  • 參數必須為 const 參考,否則會導致無限遞迴(按值傳遞需再次呼叫拷貝建構函數)。
  • 若未定義,編譯器生成預設拷貝建構函數:對非靜態資料成員執行淺拷貝(逐位元複製)。對於包含指標、資源句柄的類,淺拷貝會導致雙重釋放、記憶體洩漏等錯誤,必須自行實作深拷貝。

5. 解構函數

  • 名稱:~ClassName(),無參數、無返回值、不可多載。
  • 物件生命週期結束時(離開作用域、delete、程式結束)自動呼叫。
  • 用於釋放資源(記憶體、檔案句柄、鎖、網路連線等)。
  • 基類解構函數應宣告為 virtual,確保透過基類指標刪除衍生物件時正確呼叫衍生類解構函數。

6. 物件生命週期範例

class Resource {
    int* data;
public:
    Resource(int n = 10) : data(new int[n]) { }  // 建構函數取得資源
    ~Resource() { delete[] data; }                // 解構函數釋放資源
    // 拷貝建構函數、賦值運算子需依「三/五法則」實作
};

void Func() {
    Resource r1(100);      // 自動物件,離開作用域自動 ~Resource()
    Resource* r2 = new Resource(200);
    delete r2;             // 手動刪除,呼叫 ~Resource()
}

總結

建構/解構函數是 C++ 物件生命週期管理的核心。掌握重載、預設、拷貝、移動語意(C++11)及 RAII(資源取得即初始化)模式,能寫出安全、高效、無洩漏的程式碼。

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