构造函数与析构函数的执行顺序
对象作为成员变量的构造函数与析构函数
当一个类包含另一个类的对象作为成员时,这些成员对象的构造函数会在包含它们的对象的构造函数之前被调用,而它们的析构函数则会在包含它们的对象的析构函数之后被调用。成员对象的构造函数和析构函数的调用顺序与它们在类定义中出现的顺序相同。
class MemberClass {
public:
MemberClass() { std::cout << "MemberClass Constructor\n"; }
~MemberClass() { std::cout << "MemberClass Destructor\n"; }
};
class ContainingClass {
MemberClass member;
public:
ContainingClass() { std::cout << "ContainingClass Constructor\n"; }
~ContainingClass() { std::cout << "ContainingClass Destructor\n"; }
};
int main() {
ContainingClass obj; // MemberClass 的构造函数先被调用,然后是 ContainingClass 的构造函数
// ... 在这里,obj 对象可以使用 ...
// 当 main 函数返回时,obj 超出作用域
// ContainingClass 的析构函数先被调用,然后是 MemberClass 的析构函数
return 0;
}
结果:构造的时候先搬床再封门,析构的时候先拆门在搬床
MemberClass Constructor
ContainingClass Constructor
ContainingClass Destructor
MemberClass Destructor
类继承执行顺序
#include <iostream>
class Base {
public:
Base() { std::cout << "Base Constructor\n"; }
~Base() { std::cout << "Base Destructor\n"; }
};
class Derived : public Base {
public:
Derived() { std::cout << "Derived Constructor\n"; }
~Derived() { std::cout << "Derived Destructor\n"; }
};
int main() {
Derived d;
// 当d离开作用域时,析构函数会被自动调用
// 输出顺序将是:Derived Destructor, Base Destructor
return 0;
}
结果:构造的时候搞base地基在建立房子,先抽象在具体,析构的时候反过来
Base Constructor
Derived Constructor
Derived Destructor
Base Destructor