建構函式語義學

2021-10-06 15:48:25 字數 1357 閱讀 9823

有些書上說,如果乙個類中沒有任何的建構函式,那麼編譯器會為我們預設的合成乙個「合成預設規則函式」。

其實,系統是在「必要的時候」才會為我們合成預設的建構函式。這個可以去分析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...