談一談預設建構函式

2021-06-21 20:02:23 字數 1496 閱讀 5597

最近在看《深入探索c++物件模型》,看到預設建構函式,在這裡談一下自己的理解。

之前在看《c++ primer》的時候,看到過:當乙個類沒有建構函式時,編譯器會合成乙個預設建構函式。但是這個合成的建構函式做什麼呢?其實合成的預設建構函式只是滿足編譯器的需要,而不能滿足我們的需求。例如

class a

;

我想要初始化x(假設想要初始化為0),但是自己沒有建構函式,這是編譯器會合成乙個預設建構函式,當我定義a的物件時,會執行這個預設建構函式,但是這個預設建構函式並不會初始化x。

那麼既然合成的預設建構函式不初始化我們自定義的變數(non-static),那麼合成的預設建構函式做什麼用?

1、如果類的data member是類,且有預設建構函式。那麼這個類會合成預設建構函式(前提是它沒有其他建構函式),在這個建構函式中,呼叫data member的預設建構函式。

#includeusing namespace std;

class base

; int x;

};class derive:public base

;int main()

; int x;

};class derive:public base

; int y;

};int main()

{ derive d(5);

cout<

這是怎麼實現的呢?那麼這個類會合成預設建構函式(前提是它沒有其他建構函式)。這裡有了建構函式,那麼就不會合成建構函式了,編譯器要做的其實就是把已定義的建構函式「擴充套件」,在其中插入呼叫基類建構函式的**。插入呼叫基類的**,在初始化繼承類成員變數之前。

2、如果類的data member是類,且有預設建構函式。並且這個類也有預設建構函式。

對於這種情況,就像上面一樣,編譯器不會再重新合成預設建構函式了,它要做的只是在自己定義的預設建構函式中插入**,呼叫基類的預設建構函式。

3、帶有虛函式的類

帶有虛函式的類包括1、類宣告中有虛函式。2類繼承基類,在基類中有虛函式。

我們知道虛函式的呼叫是在執行時確定的,基於動態繫結。而動態繫結的實現是依靠虛函式表(vtbl)和虛函式指標(vptr)。虛函式表是在編譯時確定下來的,虛函式指標時放在類物件的起始位址。vptr是在物件構建時確定下來,也就是在建構函式中實現的。

如果有虛函式的類沒有建構函式,編譯器會合成預設建構函式來做這些事情。

4、虛繼承

虛繼承是為了防止「菱形繼承」,即解決多重繼承情況下公共基類的多重拷貝問題。但是當使用了虛繼承後,怎麼呼叫公共基類中的變數。

具體實現比較複雜,可以參考:

簡單來說就是新增了乙個虛基類表,在這個表裡面記錄公共變數的偏移位址,通過這個偏移位址來重新計算公共基類在繼承類中的位置。這樣就需要乙個指向虛基類表的指標放在繼承類中,這也就需要建構函式來實現了。

談一談使用者的預設收貨位址

如題,今天要談一談使用者的預設收貨位址 為什麼要談這個問題,感覺這是乙個非常成熟的設計和解決方案了,為什麼還要談。談這個的導火索是產品妹妹過來跟我說咱們的使用者位址是不是用問題,為什麼我的位址不是上一次的收貨位址了。然後我balabalabala說了一堆,我想我們是想要做一好的產品,還是要做乙個產品...

談一談教育

今晚和研究生的師兄聊了會天,突然就說到教育的問題,有點感想,就寫下來,算是我對中國教育的一點看法吧。毫無疑問,中國的教育體制存在不少問題。在高中的時候或許還不是那麼明顯 對比起大學來說 上了大學,我才看清了我們教育的一些弊端。我覺得,最大的弊端,在於價值觀的引導問題上。不知道大家有沒和我一樣覺得當今...

談一談裁員

資本寒冬,經濟不景氣,要保持公司運作,可能會涉及到裁員。另外,有些員工的價值觀已經與公司不符,再留用可能會影響團隊和公司的和諧,此時也可能會涉及到裁員。裁員,不是說想裁就能裁的,需要考慮幾個方面 為什麼要裁?是否可以不裁?裁員是否會影響業務程序?裁員是否會付出經濟代價 賠償 裁員是否會負一定的法律責...