浅析C++类创建过程构造函数调用顺序
1:理论
C++若新建一个类,则类的初始化顺序是
(1)父类构造函数(按派生表的次序调用)
(2)成员变量初始化
(3)自身构造函数
2:代码验证
#include <iostream>
using namespace std;
class A{
public:
A(){
cout<<"A的构造函数。"<<endl;
}
~A(){
cout<<"A的析构函数。"<<endl;
}
};
class B :public A{
public:
B(){
cout<<"B的构造函数。"<<endl;
}
~B(){
cout<<"B的析构函数。"<<endl;
}
};
class C:public A,public B{
public:
C(){
cout<<"C的构造函数。"<<endl;
}
~C(){
cout<<"C的析构函数。"<<endl;
}
A a;
private:
B b;
};
int main()
{
C c;
return 0;
}
运行结果:
A的构造函数。//c的父类A的构造函数
A的构造函数。//c的父类B的父类A的构造函数
B的构造函数。//c的父类B的构造函数
A的构造函数。//c的成员变量a的构造函数
A的构造函数。//c的成员变量b的父类A构造函数
B的构造函数。//c的成员变量b构造函数
C的构造函数。//c自己的构造函数
C的析构函数。//析构函数的调用顺序和构造函数的相反
B的析构函数。
A的析构函数。
A的析构函数。
B的析构函数。
A的析构函数。
A的析构函数。
析构函数的调用顺序和构造函数的相反
其中,若C的父类B是虚继承的话,也就是如下
class C:public A,virtual public B
则优先调用B的构造函数
A的构造函数。//C的父类B的父类A的构造函数
B的构造函数。//C的父类B的构造函数
A的构造函数。//C的父类A的构造函数
A的构造函数。
A的构造函数。
B的构造函数。
C的构造函数。
C的析构函数。
B的析构函数。
A的析构函数。
A的析构函数。
A的析构函数。
B的析构函数。
A的析构函数。