C++中构造函数和析构函数的调用顺序
情况一:类B继承类A
结论一:定义变量时:先调用父类的构造函数,再调用派生类的构造函数;变量销毁时:先调用派生类的析构函数,再调用父类的析构函数。
#include <iostream> using namespace std; class A { public: A() { cout<< "AAAAAAAAAAAA" <<endl; } ~A() { cout << "~AAAAAAAAAAAA" << endl; } }; class B:public A { public: B() { cout<< "BBBBBBBBB" <<endl; } ~B() { cout << "~BBBBBBBBB" << endl; } }; void solution() //当函数开始时,调用构造函数,当函数结束时,变量对象被销毁 { B b1; } int main() { solution(); return 0; }
情况二:在类B中使用类A类型的变量作为成员变量
结论二:定义变量时:先调用A中的构造函数,再调用B中构造函数;变量销毁时:先调用B的析构函数,再调用A的析构函数。
#include <iostream> using namespace std; class A { public: A(int _a) { a = _a; cout << "A构造函数" << endl; cout << a << endl; } ~A() { cout << "A析构函数" << endl; } protected: private: int a; }; class B { public: B(int _b1, int _b2): a1(1), a2(2) { cout << "B的构造函数" << endl; } B(int _b1, int _b2, int m, int n): a1(m), a2(n) { cout << "B的构造函数" << endl; b1 = _b1; b2 = _b2; } ~B() { cout << "B析构函数" << endl; } protected: private: int b1; int b2; A a1; A a2; //a的构造函数的顺序和上述的调用初始化列表顺序无关,和声明的顺序有关系 }; void display() { B b(1, 2, 3, 4); } int main() { display(); return 0; }