num: 10011 name: Zhang_fun sex: m
Destructor called. Destructor called.
3.3调用构造函数和析构函数的顺序
在使用构造函数和析构函数时需要特别注意对它们的调用时间和调用顺序。
在一般情况下,调用析构函数的次序与调用构造函数的次序恰好相反:最先调用构造函数的对象,最后调用析构函数。而最后调用构造函数的对象,最先调用析构函数。可简记为:先构造的后析构,后构造的先析构,它相当一个栈,后进先出。 对象1 的构造函数 对象2 的构造函数 对象3 的构造函数 对象3 的析构函数 对象2 的析构函数 对象1 的析构函数
上面提到,在一般情况下,调用析构函数的次序与调用构造函数的次序相反,这是对同一类存储类别的对象而言的。
(1)在全局范围中定义的对象(在所有函数之外定义的对象),在文件中的所有函数(包括主函数)执行前调用构造函数。当主函数结束或
执行 exit 函数时,调用析构函数。
(2)如果定义局部自动对象(在函数内定义对象),在创建对象时调用构造函数。如多次调用对象所在的函数,则每次创建对象时都调用构造函数。在函数调用结束时调用析构函数。
(3)如果在函数中定义静态局部对象,则在第一次调用该函数建立对象时调用构造函数,但要在主函数结束或调用 exit 函数时才调用析构函数。 例如: Void fn() {
student st1; // 定义局部自动对象 static student st2; // 定义静态局部对象 … }
对象st1是每次调用函数fn时调用构造函数在函数fn结束时调用析构函数。
对象st2是第一次调用函数fn时调用构造函数在函数fn结束时并不调用析构函数,在到主函数结束时才调用析构函数。
构造函数和析构函数在面向对象程序设计中是相当重要的。本章介绍了最基本的、使用最多的普通构造函数,在3.8节将介绍复制构造函数,在4.7节还要介绍转换构造函数。
3.4 对象数组
类是一种特殊的数据类型,它当然是 C++的合法类型,自然就可以定义对象数组。在一个对象数组中各个元素都是同类对象例如一个班级有50个学生,每个学生具有学号、年龄、成绩等属性,可以为这个班级建立一个对象数组,数组包括了50个元素: Student std[50];
可以这样建立构造函数:
Student :: student ( int=1001,int=18,int=60 );
在建立数组时,同样要调用构造函数。上面的数组有50个元素,要调用50次构造函数。如果构造函数有多个参数,C++ 要求:在等号后的花括号中为每个对象分别写出构造函数并指定实参。格式为: Student st[n]={
Student( 实参1,实参2,实参3 ); … …
Student( 实参1,实参2,实参3 ); }; n个对象
假定对象有三个数据成员:学号、年龄、成绩。下面定义有三个学生的对象数组: Student std[ 3 ]={ Student(1001, 18, 87), Student(1002, 19, 76),
Student(1003, 18, 80) }; // 构造函数带实参
在建立对象数组时,分别调用构造函数,对每个对象初始化。每个元素的实参用括号括起来,实参的位置与构造函数形参的位置一一对应,不会混淆。
例3.6 对象数组的使用方法。(长方体数组) #include
Box( int h=10, int w=12, int len=15 ):height(h), width(w), length(len) {} // 带默认参数值和参数表 int volume(); private: int height; int width; int length; };
int Box::volume() {
return(height*width*length);

