#include <iostream>
#include <cstdlib>
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:
C(){
cout<<"C - 構造"<<endl;
}
~C(){
cout<<"c - 析構"<<endl;
}
};
class E{
public:
E(){
cout<<"e - 構造"<<endl;
}
~E(){
cout<<"E - 析構"<<endl;
}
};
class D:public E{
public:
D(){
cout<< "D - 構造"<<endl;
}
~D(){
cout<< "D - 析構"<<endl;
}
private:
C c;
static B b;
};
B D::b;
int main()
{
D d;
cout << "Hello world!" << endl;
return 0;
}
運行結果如下:
分析:在一個類中,如果存在其他類的成員,先進行構造,若這個類對象是static的,靜態對象是在所有其他對象之前進行構造,若這個靜態對象要是繼承某個父類,應先構造父類,在構造派生類,所以 A - 構造;B - 構造;e - 構造(構造自己的父類);c - 構造 ;最後纔是 D - 構造;
析構的順序與其相反 進行,靜態函數最後 析構。
測試代碼:不帶static對象:
#include <iostream>
#include <cstdlib>
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:
C(){
cout<<"C - 構造"<<endl;
}
~C(){
cout<<"c - 析構"<<endl;
}
};
class E{
public:
E(){
cout<<"e - 構造"<<endl;
}
~E(){
cout<<"E - 析構"<<endl;
}
};
class D:public E{
public:
D(){
cout<< "D - 構造"<<endl;
}
~D(){
cout<< "D - 析構"<<endl;
}
private:
C c;
B b;
};
//B D::b;
int main()
{
D d;
cout << "Hello world!" << endl;
return 0;
}
結果如下:
不帶有static對象,先構造自己的父類(若存在),然後構造裏面的成員,c - 構造;B - 構造(A 是父類先構造),最後是自己的構造函數 D - 構造;析構函數與其相反;
總結:析構順序:
1 先執行函數體的析構
2 然後按照聲明順續相反的執行所有非靜態對象的析構
3 執行自己的父析構
4 若有靜態成員對象,則最後析構
構造順序:
1.先構造自己的父類,若是有靜態成員對象,最先構造靜態成員對象的父類,然後是靜態成員對象,在其次是自己父類構造
2.其他非靜態成員對象的構造
3.自己的構造函數