第17课 对象的构造(上)

Posted wanmeishenghuo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第17课 对象的构造(上)相关的知识,希望对你有一定的参考价值。

对象中的成员变量的初始值是多少?

小实验:

技术分享图片

 

 

示例如下:

技术分享图片

我们可以看到打印出来的i和j的值确实是随机值。

添加Test类的全局对象gt,再次运行结果如下:

技术分享图片

可以看到gt对象中的i和j都为0。

第20行定义的t1在栈上,而13行的gt在全局存储区。

再次在堆空间创建一个变量,程序如下:

 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 };
12 
13 Test gt;
14 
15 int main()
16 {
17     printf("gt.i = %d
", gt.getI());
18     printf("gt.j = %d
", gt.getJ());
19     
20     Test t1;
21     
22     printf("t1.i = %d
", t1.getI());
23     printf("t1.j = %d
", t1.getJ());
24     
25     Test* pt = new Test;
26     
27     printf("pt->i = %d
", pt->getI());
28     printf("pt->j = %d
", pt->getJ());
29     
30     delete pt;
31     
32     return 0;
33 }

 运行结果如下:

技术分享图片

 

 

堆空间中的对象pt中的i和j都是0,这里只是巧合。

我们应该想办法使得一个对象中的变量不管在什么存储区都有确定的初始值,如何做到这一点呢?

对象的初始化:

技术分享图片

 

技术分享图片

 

 

 

初步解决方案:

技术分享图片

 

上图中方案的示例如下:

 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
", gt.getI());
25     printf("gt.j = %d
", gt.getJ());
26     
27     Test t1;
28     
29     //t1.initialize();
30     
31     printf("t1.i = %d
", t1.getI());
32     printf("t1.j = %d
", t1.getJ());
33     
34     t1.initialize();
35     
36     Test* pt = new Test;
37     
38     pt->initialize();
39     
40     printf("pt->i = %d
", pt->getI());
41     printf("pt->j = %d
", pt->getJ());
42     
43     delete pt;
44     
45     return 0;
46 }

运行结果如下:

技术分享图片

可以看到现在的对象的值都是确定的了。

 在对象创建完之后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     Test()
12     {
13         printf("Test() Begin
");
14         
15         i = 1;
16         j = 2;
17         
18         printf("Test() End
");
19     }
20 };
21 
22 Test gt;
23 
24 int main()
25 {
26     printf("gt.i = %d
", gt.getI());
27     printf("gt.j = %d
", gt.getJ());
28     
29     Test t1;
30     
31     printf("t1.i = %d
", t1.getI());
32     printf("t1.j = %d
", t1.getJ());
33     
34     Test* pt = new Test;
35     
36     printf("pt->i = %d
", pt->getI());
37     printf("pt->j = %d
", pt->getJ());
38     
39     delete pt;
40     
41     return 0;
42 }

运行结果如下:

技术分享图片

 

 小结:

技术分享图片

 

以上是关于第17课 对象的构造(上)的主要内容,如果未能解决你的问题,请参考以下文章

第19课 对象的构造(下)

第27课二阶构造模式(上)---------出现的背景

第21课 - 对象的构造顺序

第21课对象的构造顺序

第19课 - 对象的构造(下)

第17课 StaticList和DynamicList实现