C++中构造和析构的顺序

先说结论:

构造:

  • 基类成员对象的构造函数
  • 基类的构造函数
  • 子类成员对象的构造函数
  • 子类的构造函数

析构:

  • 子类的析构函数
  • 子类成员的析构函数
  • 基类的析构函数
  • 基类成员的析构函数

借一幅图(https://blog.csdn.net/wq_1996/article/details/78219479

 

可见是刚好反过来的。 

// 验证构造函数顺序

#include<iostream>

class Mem{
public:
    Mem(int x)
    {
        std::cout << "mem constructor " << x << std::endl;
    }
};

class Base{
public:
    Base()
    {
        std::cout << "base constructor" << std::endl;
    }
    Mem* m = new Mem(1);
};

class Test : Base{
private:
    int x;
public:
    Test()
    {
        std::cout << "test constructor" << std::endl;
    }
    Mem* m = new Mem(2);
};

int main()
{
    Test* t = new Test();
}
View Code

// 验证析构函数顺序

#include<iostream>

class Mem{
public:
    ~Mem()
    {
        std::cout << "mem" << std::endl;
    };
};

class Base{
public:
    ~Base()
    {
        std::cout << "~base" << std::endl;
    };
    Mem m;
};

class Test:Base{
public:
    ~Test()
    {
        std::cout << "~test" << std::endl;
    };
    Mem m;
};

int main()
{
    Test t;
    t.~Test();
    getchar();
    return 0;
}
View Code

 

posted @ 2020-04-17 09:12  Rogn  阅读(2499)  评论(0编辑  收藏  举报