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(); }
// 验证析构函数顺序
#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; }
个性签名:时间会解决一切