構造函數的作用
構造函數的主要任務是初始化對象,而不是創建對象(對象的內存空間在構造函數被調用前已經分配好)。
構造函數特性
-
命名規則:函數名必須與類名完全相同。
-
返回值:構造函數沒有返回值類型(連void都沒有)。
-
自動調用:在創建對象時,編譯器會自動調用對應的構造函數。
-
重載能力:
-
構造函數可以重載(相同函數名,不同參數列表)
-
無參構造函數的調用要注意語法:
cpp
Date d1; // 正確調用無參構造函數 Date d2(2015, 1, 1); // 調用帶參構造函數// 錯誤示例:會被解析為函數聲明 Date d3(); // 聲明了一個返回Date對象的函數d3
-
-
默認生成規則:
-
如果類中沒有顯式定義任何構造函數,編譯器會自動生成一個無參的默認構造函數
-
一旦用戶顯式定義了任何構造函數,編譯器將不再自動生成默認構造函數
-
-
內置類型初始化問題:
-
對于內置類型(int, double, char等),默認構造函數不會進行有效初始化。編譯形成的構造函數沒有內置類型的賦值指令,值是原先開辟空間時殘留下的值
-
C++11補丁:可以在聲明成員變量時提供默認值,編譯器會自動添加賦值代碼? 如:_x(10)? ,使構造函數編譯后內置類型有對應賦值指令
cpp
class Date {int year = 1970; // 提供默認值int month = 1;int day = 1; };
- 在 C++ 中,內置類型(如?
int
、float
、double
、char
、指針等)沒有構造函數,它們的初始化完全依賴編譯器在底層生成賦值指令。
-
-
默認構造函數定義:
-
任何可以被無參調用的構造函數都是默認構造函數
-
包括:
-
無參構造函數
-
全缺省參數的構造函數
-
編譯器自動生成的構造函數
-
-