第17课 对象的构造(上)
1. 对象的初始化
(1)从程序设计的角度看,对象只是变量,因此:
①在栈上创建对象时,成员变量初始化为随机值
②在堆上创建对象时,成员变量初始化为随机值
③在静态存储区创建对象时,成员变量初始化为0值
【编程实验】成员变量的初始化 17-1.cpp
#include <stdio.h> class Test { private: int i; int j; public: int getI(){return i;} int getJ(){return j;} }; Test gt; //全局对象 int main() { //全局区,被初始化为0 printf("gt.i = %d\n", gt.getI());//0 printf("gt.j = %d\n", gt.getJ());//0 //栈上的对象,初始化为随机值 Test st; printf("st.i = %d\n", st.getI());//随机值 printf("st.j = %d\n", st.getJ());//随机值 //堆上创建对象,初始化为随机值 Test* pt = new Test; printf("pt->i = %d\n", pt->getI());//随机值 printf("pt->j = %d\n", pt->getJ());//随机值 delete pt; return 0; }
运行结果:
(2)生活中的对象都是在初始化后上市的
(3)初始状态(出厂设置)是对象普遍存在一个状态,那么程序中如何对一个对象进行初始化?
(4)一般而言,对象都需要一个确定的初始状态
(5)解决方案:
- 在类中提供一个public的initialize函数
- 对象创建后立即调用initialize函数进行初始化
(6)存在的问题:
-
initailize只是一个普通函数,必须显式调用
-
如果未调用initialize函数,运行结果是不确定的
【编程实验】初始化函数 17-2.cpp
#include <stdio.h> class Test { private: int i; int j; public: int getI() { return i; } int getJ() { return j; } void initialize() { i = 1; j = 2; } }; Test gt; int main() { gt.initialize(); printf("gt.i = %d\n", gt.getI()); printf("gt.j = %d\n", gt.getJ()); Test t1; t1.initialize(); printf("t1.i = %d\n", t1.getI()); printf("t1.j = %d\n", t1.getJ()); t1.initialize(); Test* pt = new Test; pt->initialize(); printf("pt->i = %d\n", pt->getI()); printf("pt->j = %d\n", pt->getJ()); delete pt; return 0; }
运行结果:
2. 构造函数
(1)C++中可以定义与类名相同的特殊成员函数,这个函数叫构造函数
①构造函数是没有任何返回类型(连void都没有,因为这个函数是编译器在创建对象时插入二进制代码用的,即由编译器来调用的)
②构造函数在对象定义时自动被调用
【编程实验】构造函数初探 17-3.cpp
#include <stdio.h> class Test { private: int i; int j; public: int getI(){return i;} int getJ(){return j;} //构造函数 Test() { printf("Test() Begin\n"); i = 0;//成员变量初始化 j = 0;//成员变量初始化 printf("Test() End\n"); } }; Test gt; //全局对象 int main() { //全局区 printf("gt.i = %d\n", gt.getI());//0 printf("gt.j = %d\n", gt.getJ());//0 //栈上的对象 Test st; printf("st.i = %d\n", st.getI());//0 printf("st.j = %d\n", st.getJ());//0 //堆上创建对象 Test* pt = new Test; printf("pt->i = %d\n", pt->getI());//0 printf("pt->j = %d\n", pt->getJ());//0 delete pt; return 0; }
运行结果:
3. 小结
(1)每个对象在使用之前都应该初始化
(2)类的构造函数用于对象的初始化
(3)构造函数与类同名并且没有任何类型的返回值
(4)构造函数在对象定义时自动被调用