《 C 深度剖析》學習日誌十六 物件的構造順序

2021-08-15 14:23:56 字數 1379 閱讀 1253

物件的構造順序並不難,但是有很多bug會由物件的構造順序產生,所以我們有必要梳理一下物件的構造順序。

我們先提出乙個問題:

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

當程式執行流到達物件的定義語句時進行構造,我們來看下面的**。

結果顯示就是順序執行流影響物件的建立順序。如果使用goto語句來改變他的順序流呢?

#includeclass test

test(const test& obj)

int getmi()

};int main()

goto end;

test a(100);

end:

printf("a.mi = %d\n", a.getmi());

}

顯然,在程式中跳過了a物件的建立,那麼之後再呼叫a物件,便會出現錯誤,但不是所有的編譯器都會報錯,下面是標準編譯器和vc++的編譯器結果。

而vc++中的編譯器預設了這樣的寫法

最後a物件生成了隨機數,在實際工程中是災難性的。

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

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

#include

class test

test(const test& obj)

int getmi()

};int main()

if( i < 4 )

new test(*a1);

else

new test(100);//test(int i):100

}我們來看看程式執行符不符合我們的預期。

從結果看,是符合我們的預期的。

物件的構造順序是不確定的

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

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

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

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

《C 深度剖析》學習日誌六 函式過載(下)

這段 該呼叫哪乙個函式呢?函式過載遇上函式指標 將過載函式名賦值給函式指標時 1.根據過載規則挑選與函式指標引數列表一致的候選者 2.嚴格匹配候選者的函式型別與函式指標的函式型別 函式過載必然發生在同乙個作用域中 編譯器需要用引數列表或引數型別進行函式選擇 無法直接通過函式名得到過載函式的入口位址 ...

C 學習筆記 深度剖析list

1 容器list 當你對某個type實施operator 而該type並非built in ptr時,編譯器會做一件很有趣的事,在找出user defined operator 並將它施行於該type後,編譯器會對執行結果再次施行operator 編譯器不斷執行這些動作直至觸及a pointer t...

《c語言深度剖析》學習筆記4

第五章 記憶體管理 5.1 野指標 定義指標變數的同時,最好初始化為null,用完指標之後,也將指標變數的值設定為null.5.2 棧 堆和靜態區 靜態區 儲存自動全域性變數和static變數。靜態區的內容在整個程式的生命週期內都存在,有編譯器編譯時分配。棧 儲存區域性變數。棧上的內容只在函式的範圍...