第17課構造函數(上)

問題:函數

建立一個對象時,成員變量的初始值是多少?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 }

對象建立後,構造函數就會被當即的調用執行。那麼調用是誰來作的呢?
編譯器在編譯程序時,它會敏感的發現程序中定義了構造函數,因而在建立對象的地方幫咱們自動的調用了構造函數。

小結:
每一個對象在使用以前都應該初始化
類的構造函數用於對象的初始化
構造函數與類同名而且沒有返回值
構造函數在對象定義時自動被調用

相關文章
相關標籤/搜索