C++中对象的析构顺序

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( )的代码。输出表明,析构顺序正好相反。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值