是從第二章開始看起的,通常情況下,如果以後開頭沒有特殊說明,標題中()裡數字代表的是章節序號
1.3 程式轉化語意
情況1: 如果類中包含有乙個其他類成員,且這個類成員有預設建構函式。那麼編譯器構建預設建構函式(事實上相當於是呼叫該類成員預設建構函式)
注意:其他成員仍然處於未知狀態。
例子:
class
a
a類合成的預設建構函式僅對b作用,a仍然不管他。
情況2:如果顯示寫出了建構函式,但是未對含有預設建構函式的類成員進行初始化,那麼編譯器預設補充**呼叫它的預設建構函式。
例子:
class a
;private:
b b;//假設b、c類有預設建構函式
c c;
int a;
}
a類合成的建構函式可以看做為:
a(int x=0)
情況3:繼承
與情況1類似,帶有預設建構函式的基類編譯器根據他們的宣告次序進行呼叫。
情況4:含有虛函式
虛函式指標vptr指向**是要在建構函式當中做好的,所以如果該類中有虛函式或者繼承的基類中有虛函式,那麼必須會合成預設建構函式
情況5:
由於虛繼承,則基類只有乙個副本。
所以其所有的虛繼承類,都是生成虛函式表一樣的,虛繼承類中不直接儲存虛擬基類的變數的偏移量,而是儲存乙個指標。因此,訪問變數的時候,必須要這錶,那麼就會合成預設建構函式。
< 書寫的真是晦澀。。。 >
請問什麼叫做:「會以乙個object作為class object的初值??」 :這句話翻譯的這是奇怪,這裡應該是說有以下三種情況會呼叫拷貝建構函式。
針對第一種情況:明確指出用乙個物件值作為類另乙個物件的初始化。這裡需要和賦值函式進行區分。
class
a{};
a x;
a xx = x;//呼叫拷貝建構函式
class
a{};
a x;
a xx;
xx = x;//呼叫賦值函式
判斷是呼叫賦值函式還是拷貝建構函式,是看看有沒有新的類物件生成。
這裡實際上應該是淺拷貝,因為看書上的例子:
class
string
string noun("book");
string verb = noun;
根據1.2節,可以判斷這裡應是呼叫拷貝建構函式的,預設情況下呢,你看書上是怎麼實現的:
verb.str = noun.str
;verb.len = noun.len
;
這裡是有指標的啊!!!但是沒有重新分配乙個空間,而是讓兩個指標的值相等,也就是說是指向同乙個位址空間。
這裡借用一下博文:裡的兩張圖
仔細觀察一下兩張圖,覺得這裡還是非常明確的。
看一下書會發現,下面給的例子是說,如果我們對於那種其他類型別那種需要重新分配空間的類定義了顯示拷貝建構函式,那麼會先呼叫這個顯示建構函式,然後其他的是按照淺拷貝的方式複製值過來。
這個和前面的是類似的。
1. 當class內含乙個member object而後者的class宣告有乙個copy constructor時。(不論是被class設計者明確宣告,或是被編譯器合成)
2. 當class繼承自乙個base class而後者存在乙個copy constructor時(再次強調,不論是被顯式宣告或是被合成而得)
3. 當class宣告了乙個或多個virtual function時
4. 當class派生自乙個繼承串鏈,其中有乙個或多個virtual base classes時
前兩種情況中,編譯器必須將member或base class的」copy constructors呼叫操作」安插到被合成的copy constructor中。
當有虛函式的時候,為了實現執行時的多型,意味著必須要設定正確vptr指標!!!!
書上的例子其實只是在說,當派生類初始化基類的時候呼叫拷貝建構函式的時候,為了保證虛函式指標指向的位置是正確的,因此必然不是簡單將派生類vptr值複製過來的!!!
虛繼承與第三種情況類似,但是有區別,這裡有vbtl,然而vbtl是採用的重新初始化,而不是reset;
《這個也是完全看不懂!!!>
寫的什麼啊。。。第乙個假設真實性要根據x的定義來看,那你倒是說什麼時候是假的啊。沒有說明,只是寫編譯器是怎麼操作的。!!!這些底層編譯器的轉換和我定義的class到底有什麼關係?!
深入探索C 物件模型
深入探索c 物件模型 本書目錄結構如下 第1章 關於物件 object lessons 加上封裝後的布局成本 layout costs for adding encapsulation 1.1 c 模式模式 the c object model 簡單物件模型 a object model 驅動物件模...
深入探索C 物件模型之物件
物件 一 在c語言中,資料 和 對資料的處理 函式 分開宣告的,也就是說,語言本身並沒有支援 資料和函式 之間的關聯性。例如,typedef struct point3dpoint3d 而在c 中,座標型別和座標數目都可以引數化 template class point type operator ...
深入探索C 物件模型(6)
物件陣列的構造 物件資料的構造一般有兩種方式 靜態和動態 1 靜態分配 以string類為例,string a 10 就是以靜態形式構造資料,這樣的陣列的個數是確定的不能修改的。像這樣的陣列怎麼進行構造和析構呢?編譯器在構造陣列的時候會生成乙個使用預設建構函式的陣列建構函式arr new char ...