首页 理论教育C++程序设计基础教程:组合类析构函数的设计与执行次序

C++程序设计基础教程:组合类析构函数的设计与执行次序

【摘要】:同样,当含有子对象的类存在析构函数时,特别要注意析构函数的调用次序。析构函数的调用执行顺序与构造函数刚好相反。分析以下程序的执行结果。解:上述程序中声明了4个类,类A中含有3个子对象b1、b2、b3,分别是类B1、B2、B3的对象,其声明次序是b1、b2、b3,按照子对象构造函数和析构函数的执行次序得到以下程序执行结果:B1:ConstructorB2:ConstructorB3:ConstructorA:ConstructorA:DestructorB3:DestructorB2:DestructorB1:Destructor分析以下程序的执行结果。调用在A类中第二个定义的对象成员two的构造函数。

同样,当含有子对象的类存在析构函数时,特别要注意析构函数的调用次序。析构函数的调用执行顺序与构造函数刚好相反。在含有子对象的类A中,设计析构函数如下:

~A(){函数体;}

其执行次序是:先执行函数体,再以子对象在类A中说明的相反次序调用各类的析构函数。

【例2.24】分析以下程序的执行结果。

解:上述程序中声明了4个类,类A中含有3个子对象b1、b2、b3,分别是类B1、B2、B3的对象,其声明次序是b1、b2、b3,按照子对象构造函数和析构函数的执行次序得到以下程序执行结果:

B1:Constructor

B2:Constructor

B3:Constructor

A:Constructor

A:Destructor

B3:Destructor

B2:Destructor

B1:Destructor

【例2.25】分析以下程序的执行结果。

解:程序的执行结果如下:

4,调用B的构造函数!(www.chuimin.cn)

3,调用B的构造函数!

1,调用A的构造函数!

1,调用A的析构函数!

3,调用B的析构函数!

4,调用B的析构函数!

因为建立类的对象时,先调用各个对象成员的构造函数(调用顺序取决于对象成员在类中的声明顺序),然后才执行类的构造函数。所以本例中建立类A的对象obj时,首先调用对象成员one的构造函数B(int i),然后调用对象成员two的构造函数B(int i),最后调用类A的构造函数A()。析构函数的调用顺序与构造函数正好相反。

用类A定义对象obj时,调用构造函数与析构函数的步骤如下:

(1)调用在A类中第一个定义的对象成员one的构造函数:

实参数字4通过形参k传送给one(k),再经实参k传送给形参i赋给b,调用B(i)构造函数时,输出:4,调用B的构造函数!

(2)调用在A类中第二个定义的对象成员two的构造函数。实参1→i,2→j,调用B(i+j)构造函数,输出:3,调用B的构造函数!

(3)调用A(int i,int j,int k)构造函数,实参1→i→a,输出:1,调用A的构造函数!

(4)当main()执行结束后,先执行A的析构函数,输出:1,调用A的析构函数!

(5)再执行B的析构函数,输出:3,调用B的析构函数!

(6)再执行B的析构函数,输出:4,调用B的析构函数!