作者:傻要傻到嗨样 | 来源:互联网 | 2023-10-13 12:26
1构造函数的调用顺序[1]构造函数按此顺序执行工作:按声明顺序调用基类和成员构造函数。如果类派生自虚拟基类,则会将对象的虚拟基指针初始化。如果类具有或继承了虚函数,则会将对象的虚函数指针初始化。
1构造函数的调用顺序[1]
构造函数按此顺序执行工作:
按声明顺序调用基类和成员构造函数。
如果类派生自虚拟基类,则会将对象的虚拟基指针初始化。
如果类具有或继承了虚函数,则会将对象的虚函数指针初始化。 虚函数指针指向类中的虚函数表中相应的虚函数项,确保虚函数正确地调用绑定代码。
它执行自己函数体中的所有代码。
2析构函数的调用顺序[2]
在一般情况下,调用析构函数的次序正好与调用构造函数的次序相反:最先被调用的构造函数,其对应的(同一对象中的)析构函数最后被调用,而最后被调用的构造函数,其对应的析构函数最先被调用。
可以简记为:先构造的后析构,后构造的先析构,它相当于一个栈,先进后出。
下面我们通过代码来验证,代码来自[3]:
//测试构造函数和析构函数的执行顺序
#include
using namespace std;
class A{
public:
A(int n){
cout<<"call structor A(int n):"<m_num = n;
}
A(const A &a){
cout<<"call structor A(const A &a):"<}
virtual ~A(){
cout<<"call destructor ~A()."<}
A& operator=(const A &a){
this -> m_num = a.m_num;
return *this;
}
private:
int m_num;
};
class B:public A{
public:
B(int n):A(n){
cout<<"call structor B(int n)"<}
~B(){
cout<<"call destructor ~B()."<}
};
int main()
{
A *pa = new B(10);
delete pa;
return 0;
}
运行结果如下:
[1]:
http://msdn.microsoft.com/zh-cn/library/s16xw1a8.aspx
[2]
http://see.xidian.edu.cn/cpp/biancheng/view/197.html
[3]
http://jaden.blog.51cto.com/1549175/324480