21,物件的構造順序

2022-07-20 10:18:10 字數 2441 閱讀 1824

好多bug由物件構造造成--------物件的構造與建構函式有關係

—c++中的類可以定義多個物件,那麼物件構造順序是怎樣的?

(1)對於區域性物件:當程式執行流到達物件的定義語句進行構造。   物件定義--->構造---->呼叫建構函式

1 #include2

3class

test

413 test(const test& obj) //

拷貝建構函式

1418

19/*

20int getmi()

2124

*/25

};26

27int

main()

2836

37if (i < 4)38

41else

4245

46/*

47goto end; 不能非法改變程式的執行流

4849

test a(100); //a沒有構造,初始化,後面不能使用

50end:

51printf("a.mi=%d\n",a.getmi()); //沒有初始化物件,沒有呼叫建構函式,有的編譯器會輸出隨機值

5253

*/54

return0;

55 }

(2)對於堆物件

①當程式執行流到達new語句建立物件

②使用new建立物件自動觸發建構函式的呼叫

1 #include23//

堆物件的構造順序 test* a1 = new test(i); 45

class

test

615 test(const test& obj) //

拷貝建構函式

1620

21};

2223

intmain()

24

(3)對於全域性物件

物件的構造順序不確定的

不同的編譯器使用不同的規則確定構造順序

#ifndef _test_h_

#define _test_h_

#includeclass test

}; #endif

#include "test.h"

test t1("t1");//全域性變數

#include "test.h"

test t2("t2");//全域性變數

#include "test.h"

test t3("t3");//全域性變數

#include #include "test.h"

//注意:全域性變數會先於main函式執行,因此

//4個全域性變數t1-t4會被先構造,再其順序是不確定的,

//要依賴於編譯器。 那麼不同的編譯器使用不同的規則確定全域性變數的構造順序

//當構造完全局物件後,會執行main函式,可以發現

//t5是最後乙個被構造的。

test t4("t4"); //全域性變數 他的構造在main()之前

int main()

g++編譯器的輸出結果:

//實驗1:g++ main.cpp t1.cpp t2.cpp t3.cpp

//t3->t2->t1->t4->t5:從右向左

//實驗2:g++  t3.cpp t1.cpp main.cpp t2.cpp

//t2->t4->t1->t3->t5:從右向左

(1)區域性物件構造順序依賴於程式的執行流

(2)堆物件構造順序依賴於new的使用順序

(3)全域性物件構造順序是不確定的

17 物件的構造

如果沒有賦初值,全域性儲存區的成員變數初始值系統預設為0,棧空間和堆空間上成員變數初始值系統預設為隨機數。從程式設計的角度,物件只是變數,c 中可以定義與類名相同的特殊成員函式 建構函式。建構函式沒有任何返回型別的宣告。建構函式在物件定義時自動呼叫。每個物件在使用之前都應該初始化,建構函式用於物件初...

11 物件的構造

目錄從程式設計的角度,物件只是變數,因此 問題 程式中如何對乙個物件進行初始化,使得不管在什麼地方建立類物件,其成員變數的初始值都為固定值?解決方案1 存在的問題 解決方案2 建構函式 示例 建構函式 注意 物件定義和物件宣告不同 建構函式的自動呼叫 class test test int v in...

17 物件的構造(中)

1 建構函式 建構函式和普通函式的區別 普通函式的函式名可以隨機定義,而建構函式的函式名和類名一致 普通函式有返回值,而建構函式沒有返回值 普通函式可以定義引數,那麼建構函式可以定義引數嗎?class test test t 定義物件並呼叫建構函式 int main 我們的整個編譯過程分為好幾步 1...