C++中对象的析构顺序
Tuna 实例不再在作用域内时,析构顺序与构造顺序相反。如下示例程序所示的简单示例演示了构造顺序和析构顺序。
#include <iostream>
using namespace std;
class FishDummyMember
{
public:
FishDummyMember()
{
cout << "FishDummyMember constructor" << endl;
}
~FishDummyMember()
{
cout << "FishDummyMember destructor" << endl;
}
};
class Fish
{
protected:
FishDummyMember dummy;
public:
// Fish constructor
Fish()
{
cout << "Fish constructor" << endl;
}
~Fish()
{
cout << "Fish destructor" << endl;
}
};
class TunaDummyMember
{
public:
TunaDummyMember()
{
cout << "TunaDummyMember constructor" << endl;
}
~TunaDummyMember()
{
cout << "TunaDummyMember destructor" << endl;
}
};
class Tuna: public Fish
{
private:
TunaDummyMember dummy;
public:
Tuna()
{
cout << "Tuna constructor" << endl;
}
~Tuna()
{
cout << "Tuna destructor" << endl;
}
};
int main()
{
Tuna myDinner;
}
输出:
FishDummyMember constructor
Fish constructor
TunaDummyMember constructor
Tuna constructor
Tuna destructor
TunaDummyMember destructor
Fish destructor
FishDummyMember destructor
分析:
第 67~70 行的 main( )很短,但输出量很大。实例化一个 Tuna 对象就生成了这些输出,这是由于构造函数和析构函数包含 cout 语句。为了帮助理解成员变量是如何被实例化和销毁的,定义了两个毫无用途的类—FishDummyMember 和 TunaDummyMember, 并在其构造函数和析构函数中包含了 cout 语句。 Fish 和 Tuna 类分别将这些类的对象作为成员,如第 20 和 53 行所示。输出表明,实例化 Tuna 对象时,将从继承层次结构顶部开始,因此首先实例化 Tuna 对象的 Fish 部分。为此,首先实例化 Fish 的成员属性,即 Fish::dummy。构造好成员属性(如 dummy)后,将调用 Fish 的构造函数。构造好基类部分后,将实例化 Tuna 部分—首先实例化成员 Tuna::dummy,再执行构造函数 Tuna::Tuna( )的代码。输出表明,析构顺序正好相反。