《深入理解C 物件模型》 預設建構函式

2021-08-20 12:38:09 字數 1206 閱讀 1153

explict關鍵字之所以被匯入c++,是為了給程式設計師提供一種方法,使他們能夠制止單一引數的建構函式被當做乙個轉換運算子。

《深入理解c++物件模型》關於c++預設建構函式什麼時候並合成有四點要求。在介紹這四點要求之前,需要先了解虛基類是如何實現的?

虛基類是為了解決多重繼承出現的二義性。

class x

class a:virtual public x

class b:virtual public x

class c: public a,public b

在虛繼承的下 c中只含有x中變數a的乙個例項,而不是兩個。也即,在虛繼承的情況下,base class不管在繼承串鏈中被派生多少次,永遠只有乙個例項。

乙個派生類如何在本質上模塑其base class的例項ne?

在《深入理解c++物件模型》這本書中給出兩種解釋:

1.在簡單物件模型中,將每乙個派生類的slot指向基類,此slot即是基類的例項的位址。

2.base table模型。base class table中的每乙個slot內含乙個相關的base class位址,每乙個類物件有乙個指標指向其base class table。

因此 若宣告了c的物件c: c c;

則c的布局如下:

vb_ptr:繼承自a

int a

vb_ptr:繼承自b

int b

int x

int c

首先,找到vb_ptr(這個不用找,因為在g++中,vb_ptr就是b*中的第一項,呵呵),然後取得vb_ptr指向的位址的內容(這個例子是20),最後把這個內容與指標pb相加,就得到pb->a的位址了。

所以說這種時候,用指標轉換多了兩個中間層才能找到基類的成員,而且是執行期間。來自

下面開始講何時需要預設建構函式?

所謂預設建構函式的構建是當編譯器需要的時候。並且並合成出來的建構函式只執行編譯器所需要的行動。

何時是編譯器需要呢?

1. 某些類中的成員包含乙個有預設建構函式的類的物件,那麼此時,這些類需要編譯器合成預設建構函式。

2.帶有預設建構函式的基類。也即某些類是某基類派生而來,且該基類含有預設建構函式,那麼這些派生類需要編譯器合成預設建構函式

3.含有虛函式的類,需要編譯器合成預設建構函式。這是因為,需要編譯器生成虛表

4.帶有乙個虛基類的類

編譯器合成出來的預設建構函式並不會顯示設定類中的每乙個資料成員的預設值。

C 建構函式深入理解

01 初始化引數列表.cpp include include include using namespace std struct student 拷貝建構函式定義 拷貝建構函式的有效引數,必須是該類的物件的引用 if 1 student student s,int class no 1 else ...

深入理解C 物件模型1 關於物件

c 物件模型可以從兩個層面來解釋 本文主要從第二個方面來進行剖析。注 c 物件模型的底層實現機制並未標準化,不同的編譯器對物件模型的底層實現機制可能有所差異,但其目標都是優化物件空間和時間的訪問效率,並支援c 語言說規定的虛函式,虛基類等機制。相比於c,c 在記憶體布局以及訪問時間 效率 上的主要的...

深入理解各種建構函式

include includeusing namespace std class test else test const test t else test operator const test t pdata new char strlen t.pdata 1 strcpy pdata t.pd...