码迷,mamicode.com
首页 > 其他好文 > 详细

第17课 对象的构造(上)

时间:2018-08-31 23:31:52      阅读:330      评论:0      收藏:0      [点我收藏+]

标签:.com   解决   添加   margin   一点   private   div   return   include   

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

小实验:

技术分享图片

 

 

示例如下:

技术分享图片

我们可以看到打印出来的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\n", gt.getI());
18     printf("gt.j = %d\n", gt.getJ());
19     
20     Test t1;
21     
22     printf("t1.i = %d\n", t1.getI());
23     printf("t1.j = %d\n", t1.getJ());
24     
25     Test* pt = new Test;
26     
27     printf("pt->i = %d\n", pt->getI());
28     printf("pt->j = %d\n", 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\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 }

运行结果如下:

技术分享图片

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

 在对象创建完之后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\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 }

运行结果如下:

技术分享图片

 

 小结:

技术分享图片

 

第17课 对象的构造(上)

标签:.com   解决   添加   margin   一点   private   div   return   include   

原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9568634.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!