问题:函数
建立一个对象时,成员变量的初始值是多少?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 }
对象建立后,构造函数就会被当即的调用执行。那么调用是谁来作的呢?
编译器在编译程序时,它会敏感的发现程序中定义了构造函数,因而在建立对象的地方帮咱们自动的调用了构造函数。
小结:
每一个对象在使用以前都应该初始化
类的构造函数用于对象的初始化
构造函数与类同名而且没有返回值
构造函数在对象定义时自动被调用