1. 程式人生 > >C++中物件的構造順序

C++中物件的構造順序

    在前邊幾課,我們知道了類的建構函式,在生成類物件時會被自動呼叫,但是假如我們定義多個物件,那麼這些定義的物件,他們的建構函式執行的順序是怎樣的?換句話說就是類物件的構造順序是怎樣的?

    我們來直接揭曉答案吧,這裡我共分為3中情況
    -全域性區定義的物件的構造順序是不確定的,不同的編譯器使用不同的構造規則
    -區域性物件:當程式執行流到達物件構造語句時進行構造
    -物件:當程式執行流執行到new關鍵字時建立物件,new建立物件時會自動呼叫建構函式

#include <iostream>
#include <string>

using namespace std;

class test
{
private:
    string m_str;
	
public:

    test(string str): m_str(str)
    {
    	cout << m_str << endl;
    }
};

test t1("t1");	//全域性區定義物件
test t2("t2");
test t3("t3");

int main()
{
    //區域性區棧空間定義物件
    test t4("t4");
    if (true)
    {
    	test t5("t5");
    }
    else
    {
    	test t6("t6");
    }

    //堆空間定義物件
    test *pt7 = NULL;
    test *pt8 = NULL;

    pt8 = new test("pt8");
    pt7 = new test("pt7");

    system("pause");
}

上邊程式碼我們分別在全域性區、棧區、堆空間進行物件的定義,編譯輸出如下:


其中t1 ~ t3在全域性區,構造順序根據編譯器而定(這裡使用的時vs2010);t4~t6是在棧區定義的物件,程式執行流為t4然後t5,t6沒執行到,所以構造的順序為t4->t5;pt7~pt8是在堆空間定義的物件,但是我們先對pt8使用的關鍵字new,即先生成pt8對應的物件,所以構造順序是先構造pt8,再構造pt7.

總結
    -區域性物件的構造順序依賴於程式的執行流
    -堆物件的構造順序依賴於new關鍵字的使用順序
    -全域性區物件的構造順序不確定,依據具體編譯器的實現