C++ 構造,析構順序(靜態對象)

測試代碼:
#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.自己的構造函數


發佈了102 篇原創文章 · 獲贊 16 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章