C++ 構造,析構順序(靜態物件)
阿新 • • 發佈:2019-02-07
測試程式碼:
結果如下:
#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.自己的建構函式