对象中的成员变量的初始值是多少?
小实验:
示例如下:
我们可以看到打印出来的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 }
运行结果如下:
小结:
原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9568634.html
时间: 2024-10-12 22:50:59