C++ 允許類定義多個構造函數(構造函數重載),但在創建對象時,系統究竟會調用哪一個?是全部調用,還是只調用其中一個?這是初學者最容易混淆的概念之一。
只會調用一個構造函數,且是根據實參類型匹配最合適的那一個。
class CTest {
public:
CTest() { m_nValue = 1; } // 無參構造函數
CTest(int nValue) { m_nValue = nValue; } // 有參構造函數
int m_nValue;
};
int main() {
CTest test1; // 調用 CTest(),m_nValue = 1
CTest test2(10); // 調用 CTest(int),m_nValue = 10
return 0;
}
class Example {
public:
Example(); // 1. 默認構造
Example(int a); // 2. 單參數
Example(int a, int b = 0); // 3. 兩參數(第二個有默認值)
Example(double d); // 4. double 參數
};
Example e1; // 調用 1
Example e2(5); // 調用 2(精確匹配 int)
Example e3(5, 3); // 調用 3
Example e4(3.14); // 調用 4(精確匹配 double)
Example e5(10); // 調用 2,而非 3(因為 3 需要兩個參數)
explicit 關鍵字防止單參數構造函數的隱式轉換構造函數重載提供了靈活的對象初始化方式,編譯器根據實參進行靜態綁定,只調用唯一最匹配的構造函數。理解重載解析規則,能幫助你設計更直觀、更安全的類接口。