問題:函數
建立一個對象時,成員變量的初始值是多少?spa
從程序設計的角度,對象只是變量,所以:
-在棧上建立對象時,成員變量初始爲隨機值
-在堆上建立對象時,成員變量初始爲隨機值
-在靜態存儲區建立對象時,成員變量初始爲0值設計
生活中的對象都是在初始化後上市的(好比說手機)
初始狀態(出廠設置)是對象廣泛存在的一個狀態
問題:
程序中如何對一個對象進行初始化?code
通常而言,對象都須要一個肯定的初始狀態對象
解決方案blog
方案一:get
-在類中提供一個public的initialize函數
-對象建立後當即調用initialize函數進行初始化
代碼以下:編譯器
1 #include <stdio.h>
2
3 class Test 4 { 5 private: 6 int i; 7 int j; 8 public: 9 int getI() { return i; } 10 int getJ() { return j; } 11 void initialize() 12 { 13 i = 1; 14 j = 2; 15 } 16 }; 17
18 Test gt; 19
20 int main() 21 { 22 gt.initialize(); 23
24 printf("gt.i = %d\n", gt.getI()); 25 printf("gt.j = %d\n", gt.getJ()); 26
27 Test t1; 28
29 t1.initialize();
30
31 printf("t1.i = %d\n", t1.getI()); 32 printf("t1.j = %d\n", t1.getJ()); 33
34 // t1.initialize(); 35
36 Test* pt = new Test; 37
38 pt->initialize(); 39
40 printf("pt->i = %d\n", pt->getI()); 41 printf("pt->j = %d\n", pt->getJ()); 42
43 delete pt; 44
45 return 0; 46 }
上述這種方式雖然能知足要求,可是還存在一個問題。it
假如在建立了對象後,沒有當即調用initialize()函數,又會怎樣呢?io
能夠將上面的代碼,第29行注掉,第34行打開,再實驗一下,觀察一下現象。
t1這個對象,它的成員變量i,j又是隨機值了。
這種解決方案,雖然在必定程度上解決問題,可是它並不完美。既然是對象建立後就必須調用的函數,爲何initialize函數必須手工調用呢?若是是人手工調用的話,就有可能出錯。要麼忘記了調用,要麼調用的順序不對。因此,應該有一個大膽的想法,這個initialize函數能不能自動調用?
因而就誕生了構造函數。
C++中能夠定義與類名相同的特殊成員函數
-這種特殊的成員函數叫作構造函數
構造函數沒有任何返回類型的聲明
構造函數在對象定義時自動被調用
1 #include <stdio.h>
2
3 class Test 4 { 5 private: 6 int i; 7 int j; 8 public: 9 int getI() { return i; } 10 int getJ() { return j; } 11 Test() 12 { 13 printf("Test() Begin\n"); 14 15 i = 1; 16 j = 2; 17 18 printf("Test() End\n"); 19 } 20 }; 21
22 Test gt; 23
24 int main() 25 { 26 printf("gt.i = %d\n", gt.getI()); 27 printf("gt.j = %d\n", gt.getJ()); 28
29 Test t1; 30
31 printf("t1.i = %d\n", t1.getI()); 32 printf("t1.j = %d\n", t1.getJ()); 33
34 Test* pt = new Test; 35
36 printf("pt->i = %d\n", pt->getI()); 37 printf("pt->j = %d\n", pt->getJ()); 38
39 delete pt; 40
41 return 0; 42 }
對象建立後,構造函數就會被當即的調用執行。那麼調用是誰來作的呢?
編譯器在編譯程序時,它會敏感的發現程序中定義了構造函數,因而在建立對象的地方幫咱們自動的調用了構造函數。
小結:
每一個對象在使用以前都應該初始化
類的構造函數用於對象的初始化
構造函數與類同名而且沒有返回值
構造函數在對象定義時自動被調用