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

第17课 对象的构造(上)的相关文章

第17课 - 对象的构造

第17课 - 对象的构造(上) 0. 问题 对象中成员变量的初始值是什么? 下面的类定义中成员变量 i 和 j 的初始值是什么?  对象定义在 全局空间.栈上.堆上,具有不同的属性. 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

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

第19课 - 对象的构造(下) 1. 特殊的构造函数 (1)无参构造函数 当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且其函数体为空. (2)拷贝构造函数 当类中没有定义拷贝构造函数时,编译器默认提供一个拷贝构造函数,简单的进行成员变量的值复制. 1 #include <stdio.h> 2 3 class Test 4 { 5 private: 6 int i; 7 int j; 8 public: 9 int getI() 10 { 11 return i; 12 } 13

C++--第17课 - 继承与多态 - 上

第17课 - 继承与多态 - 上 引入: 如果子类定义了与父类中原型相同的函数会发生什么? 1. 函数重写 在子类中定义与父类中原型相同的函数,函数重写只发生在父类与子类之间. 父类中被重写的函数依然会继承给子类,默认情况下子类中重写的函数将隐藏父类中的函数,通过作用域分辨符::可以访问到父类中被隐藏的函数. #include <cstdlib> #include <iostream> using namespace std; class Parent { public: void

第21课 对象的构造顺序

1. 对象的构造顺序 (1)对于局部对象:当程序执行流到达对象的定义语句时进行构造 [实例分析]局部对象的构造顺序 (2)对于堆对象 ①当程序执行流到达new语句时创建对象 ②使用new创建对象将自动触发构造函数的调用 [编程实验]堆对象的构造顺序 (2)对于全局对象 ①对象的构造顺序是不确定的 ②不同的编译器使用不同的规则确定构造顺序 [实例分析]全局对象的构造顺序 2.小结 (1)局部对象的构造顺序依赖于程序的执行流 (2)堆对象的构造顺序依赖于new的使用顺序 (3)全局对象的构造顺序是不

第21课对象的构造顺序

对象的构造顺序一C++中的类可以定义多个对象,那么对象的构造顺序是怎样的呢?对于局部对象当程序执行流到达对象的定义语句时进行构造对象定义------>构造 原文地址:https://www.cnblogs.com/-glb/p/11846137.html

第18课 对象的构造(中)

1. 带参数的构造函数 (1)构造函数可以根据需要定义参数 (2)一个类中可以存在多个重载的构造函数 (3)构造函数的重载遵循C++重载规则 [友情提示]对象的定义和声明不同 ①对象定义:申请对象的空间并调用构造函数(如Test t;//定义并调用构造函数) ②对象声明:告诉编译器己经存在一个对象,并不调用构造函数(如extern Test t;) 2. 构造函数的调用 (1)一般情况下,编译器会根据给定的参数情况自动调用相应的构造函数 [编程实验]带参数的构造函数 #include <stdi

C++语言(03)——对象的构造

对象的构造(上) 成员变量的初始值 (1)从程序设计的角度来看,对象只是变量,定义对象就是定义变量,所以:在栈上创建对象时,成员变量初始值为随机值在堆上创建对象时,成员变量初始值为随机值在静态数据区上创建对象时,成员变量初始值为0(2)全局变量和static修饰的局部变量存储在静态数据区,没有显式初始化其值为0(bss/ZI段) /** 从程序设计的角度来看,对象只是变量,定义对象就是定义变量,所以: 在栈上创建对象时,成员变量初始值为随机值 在堆上创建对象时,成员变量初始值为随机值 在静态数据

C++---对象的构造

一.对象的构造(上) Q:对象中成员变量的初始值是多少? #include <iostream> using namespace std; class Test { private: int i; int j; public: int getI() { return i; } int getJ() { return j; } }; int main() { Test t1; cout<<"t1.getI()="<<t1.getI()<<e

第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all; Select 列 into 新表;字符串函数;日期函数

第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all;  Select 列 into 新表;字符串函数;日期函数 SQL聚合函数 MAX(最大值).MIN(最小值).AVG(平均值).SUM(和).COUNT(数量:记录的条数) 聚合函数对null不计算.如果一行数据都是null,count(*)包含对空值行.重复行的统计. --聚合函数演示 selec