1. 程式人生 > >C++ 構造,析構順序(靜態物件)

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.自己的建構函式