物件的構造順序並不難,但是有很多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變數。靜態區的內容在整個程式的生命週期內都存在,有編譯器編譯時分配。棧 儲存區域性變數。棧上的內容只在函式的範圍...