天天看點

《深入了解C++對象模型》讀書筆記(一)

1、           C++類對象模型的中包括非靜态成員變量和虛函數表指針,其他靜态成員變量和成員函數均放在對象模型之外,所有的對象示例均可以共同使用。如此可以節省通路的時間和空間效率。

《深入了解C++對象模型》讀書筆記(一)

2、           虛繼承是為了解決多重繼承中出現公共的基類出現二義性。

  class A;

  classB1:public virtual A;

  classB2:public virtual A;

  classD:public B1,public B2;

3、           虛函數實作多态性,即通過基類指針來通路其他派生類中的同名函數。實作動态運作時綁定。

4、           轉型cast不能改變指針所含的真正位址,它隻影響被指出位址的記憶體的大小和其内容。例如将空指針轉型成其他指針。

5、           對于一個類,若其中沒有使用者定義的構造函數,則編譯器會暗中生成一個預設的構造函數,主要有四種情況:A:有預設構造函數的成員類對象;B:含有預設構造函數的基類;C:帶有虛函數的類,主要是為了正确初始化虛函數表的值;D:含有虛基類,處理操作虛基類的指針。

有幾個原則:1、若類顯示定義了任何構造函數,則編譯器不會生成預設構造函數;2、編譯器合成的預設構造函數,并不會明确給類中每一個資料成員一個預設的值。

6、           複制構造函數常用于将一個對象的值賦給另外一個對象,有三種情形:1、對一個對象用另一個對象做初始化;2、把對象作為參數傳遞給一個函數;3、把對象作為函數的傳回值。

四種情況下,需要編譯器産生複制構造函數:

《深入了解C++對象模型》讀書筆記(一)

 後兩種情況主要是因為存在虛函數表指針需要考慮。

7、           初始化清單:初始化順序僅與聲明順序有關。充分利用初始化清單可以提高程式的運作效率。

8、           函數的重載(overload)、覆寫(override)、隐藏:重載出現在同一個類中的不同成員函數之間,一般函數名相同,參數類型或個數不同;覆寫也叫重寫,值得是基類和派生類之間,基類的虛函數被派生類同名且參數相同的函數重寫,覆寫掉;隐藏也是指基類和派生類之間,同名但參數不同的函數之間,若同名且參數相同,且基類無virtual關鍵詞,則基類的函數都會被子類隐藏。

9、         空類的大小為1位元組,編譯器需要在類中插入一個char位元組,使得類在記憶體中具有獨一無二的位址。

10、         類的大小與以下幾個因素有關:非靜态成員變量、虛繼承、基類的非靜态成員變量。

11、         同一個通路級别(public/private/protect)中的元素在記憶體中排列順序與聲明順序一樣,

12、         對靜态成員變量的通路,通過指針和對象通路效果均一樣,但針對非靜态成員變量,需要通過獲得起始位置的偏移量來通路。虛拟繼承會導緻對成員變量的通路增加間接性,效率降低。

《深入了解C++對象模型》讀書筆記(一)