C++中物件的構造順序
阿新 • • 發佈:2019-01-08
在前邊幾課,我們知道了類的建構函式,在生成類物件時會被自動呼叫,但是假如我們定義多個物件,那麼這些定義的物件,他們的建構函式執行的順序是怎樣的?換句話說就是類物件的構造順序是怎樣的?
我們來直接揭曉答案吧,這裡我共分為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關鍵字的使用順序
-全域性區物件的構造順序不確定,依據具體編譯器的實現