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

C++ 構造函數完全指南:初始化列表、默認構造與最佳實踐

     編輯:關於C++

構造函數的核心職責

確保每個對象的數據成員在創建時擁有合適的初始值。

一、構造函數的基本特性

  1. 可重載:同一類可有多個構造函數,參數列表唯一即可。
  2. 實參決定調用:編譯器根據實參匹配對應構造函數。
  3. 自動執行:創建對象時編譯器自動調用。
  4. 不可聲明為 const:即使初始化 const 對象,也調用普通構造函數。

二、構造函數初始化列表

語法:ClassName::ClassName(params) : member1(val1), member2(val2) { ... }

關鍵差異:

  • 初始化階段:成員在進入函數體前完成初始化。
  • 賦值階段:函數體內的賦值屬於計算階段,成員已有值(可能經過默認構造)。

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

  1. 無默認構造函數的類類型成員。
  2. const 或引用類型成員(只能初始化,不能賦值)。

成員初始化順序:按類中聲明順序,而非初始化列表順序。建議列表順序與聲明順序一致,避免用未初始化成員初始化其他成員。

三、默認實參與默認構造函數

  • 為所有參數提供默認實參的構造函數也是默認構造函數。
  • 合成默認構造函數:僅在類未聲明任何構造函數時由編譯器生成。內置類型成員不初始化(局部對象),類類型成員調用其默認構造。
  • 類應盡可能提供自己的默認構造函數,將內置成員初始化為 0 或空狀態。

四、代碼示例

class ConstRef {
    int i; const int ci; int &ri;
public:
    ConstRef(int ii) : i(ii), ci(ii), ri(ii) {} // 正確:初始化列表
    // ConstRef(int ii) { i=ii; ci=ii; ri=ii; } // 錯誤:const 和引用不能賦值
};

class SalesItem {
    string isbn; int units; double revenue;
public:
    SalesItem(const string &book, int cnt, double price)
        : isbn(book), units(cnt), revenue(cnt * price) {} // 表達式初始化
    SalesItem() : isbn(10, '9'), units(0), revenue(0.0) {} // 類類型成員指定構造
};

五、最佳實踐總結

  1. 優先使用初始化列表,特別是 const、引用、無默認構造的類成員。
  2. 按成員聲明順序編寫初始化列表。
  3. 若定義了其他構造函數,請顯式提供默認構造函數。
  4. 避免在初始化列表中使用成員初始化其他成員(順序陷阱)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved