有些書上說,如果乙個類中沒有任何的建構函式,那麼編譯器會為我們預設的合成乙個「合成預設規則函式」。
其實,系統是在「必要的時候」才會為我們合成預設的建構函式。這個可以去分析obj檔案
情況1:
如果乙個類中沒有任何的建構函式,且它的成員變數中含有乙個類型別的成員,那麼這個時候系統會為這個類合成乙個預設的建構函式。
classa}
;classc;
intmain()
分析:為什麼會呼叫a
()呢?其實是編譯器為類c合成了乙個預設的建構函式,而這個預設建構函式又去呼叫a()
,來初始化a,所以會呼叫a
()
classa}
;classb}
;classc;
intmain()
那麼這個時候系統會先呼叫a()
,在呼叫b
(),呼叫順序和類c中定義成員變數的順序有關。
情況2:父類有乙個預設建構函式,而子類沒有建構函式時,編譯器會為子類合成乙個預設建構函式,從而讓這個合成的預設建構函式去呼叫父類中的建構函式。
classa}
;classb:
public a
;int
main()
情況三:乙個類含有虛函式時,但沒有任何建構函式時。
這種情況下,因為有虛函式的存在,所以會生成乙個虛函式表,且在編譯器合成的建構函式中安插**,即,把虛函式表位址賦給了虛函式指標。
這可以通過彙編**來看。
classa}
;a a;
//只是這裡不會去呼叫該虛函式,因為編譯器安插的**中沒這麼幹。
情況四:當乙個類帶有虛基類時。
虛基類(虛繼承)只會出現在三層結構中。
這裡,編譯器會為c合成乙個預設的建構函式,同時編譯器也為a,a2合成了預設建構函式。
class
grand
;classa:
virtual
public grand//虛繼承
;classa2:
virtual
public grand//虛繼承
;classc:
public a,
public a2
;int
main()
情況五:
類裡的變數進行初始化。
也就是有賦初值的情況。
建構函式語義學之程式轉化語義學 2
在 建構函式語義學之程式轉化語義學 1 中編譯器做了一些優化,有時他還會給你的程式更多的優化 1 在使用者層面做優化 如果程式設計師頂乙個計算用的 constructor x bar const t y,const t z x xx 以 y 和 z 來處理 xx return xx 有的編譯器開發人...
C 函式語義學
我們或許會認為呼叫類成員函式的開銷會大於呼叫普通函式,但是其實不是這樣的,呼叫普通成員函式和全域性函式開銷差不多,我們可以在vs中除錯,檢視反彙編 普通成員函式在呼叫的時候編譯器會在傳遞乙個物件的this指標 eg includeusing namespace std class a void te...
C 虛函式語義學
c 中的多型通過虛函式表實現,需要在執行時,根據指標所指物件的實際型別,根據物件中的虛函式表指標來索引相應的虛函式來呼叫。對於class derived public base1,public base2 base2 pbase2 new derived pbase2會調整this指標,使pbase...