第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 }

对象建立后,构造函数就会被当即的调用执行。那么调用是谁来作的呢?
编译器在编译程序时,它会敏感的发现程序中定义了构造函数,因而在建立对象的地方帮咱们自动的调用了构造函数。

小结:
每一个对象在使用以前都应该初始化
类的构造函数用于对象的初始化
构造函数与类同名而且没有返回值
构造函数在对象定义时自动被调用

相关文章
相关标签/搜索