構造函數是類的特殊成員函數,用於初始化類對象。特點:
void 也不能寫)。若類未聲明任何構造函數,編譯器會合成一個默認構造函數:
⚠️ 內置類型成員不會自動初始化為 0,需顯式初始化。
在函數體執行之前初始化成員,語法:
ClassName::ClassName(params) : member1(val1), member2(val2) { /* 函數體 */ }
必須使用初始值列表的情況:
const 成員。初始化順序按成員在類中聲明順序,而非列表順序(建議列表順序與聲明順序一致)。
單參數構造函數隱式定義了從參數類型到類類型的隱式轉換。加上 explicit 關鍵字可禁止隱式轉換:
class String {
public:
explicit String(int n); // 禁止 String s = 10;
};
一個構造函數調用同類的另一個構造函數完成初始化:
class SalesData {
public:
SalesData() : SalesData("", 0, 0) {} // 委托給三參數版本
SalesData(string s) : SalesData(s, 0, 0) {}
SalesData(string s, unsigned cnt, double price) { ... }
};
| 類型 | 參數 | 用途 |
|---|---|---|
| 默認構造 | 無參或全有默認值 | 無參創建對象 |
| 拷貝構造 | const ClassName& | 從同類對象初始化 |
| 移動構造 (C++11) | ClassName&& | 從右值初始化,資源轉移 |
若未聲明,編譯器會合成(逐成員拷貝/移動)。管理動態資源的類必須自定義(遵循三/五法則)。