Inside The C++ Object Model(五)

============================================================================
5-0. 通常而言,class 的data member 應該被初始化,而且只在constructor中是在class 的其餘member functions 中指定初值。其餘任何操做都將破壞封裝性質,是class 的維護和修改更加困難。函數


圖片5-0;測試

(1)純虛擬函數的存在
注:編譯器不會在擴展derived class 的destructor時中止對pure Virtual destructor的調用操做(由於class設計者可能真的定義了一個pure Virtual destructor);編譯器也不會本身取合成一個pure Virtual destructor的函數定義(編譯器沒有足夠的知識,由於編譯器對一個可執行文件採起「分離編譯模型」)。
一個比較好的替代方案就是,不要把Virtual destructor 聲明爲pure。優化

(2)虛擬規格的存在
通常而言,把全部的成員函數都聲明爲Virtual function,而後再靠編譯器的優化操做把非必要的Virtual invocation 去除,並非好的設計觀念。設計

(3)虛擬規格中const的存在
不把函數聲明爲const,意味着該函數不可以得到一個const reference 或 const pointer。比較使人頭大的是,聲明一個函數爲const,而後才發現其derived instance 必須修改某一個data member。簡單想法:再也不用const就是了。對象

(4)從新考慮class 的聲明blog


圖片5-0-1;繼承


============================================================================
5-1. 「無繼承」狀況下的對象構造圖片


圖片5-1-1;ci

(1)抽象數據類型
若是要對class 中的全部成員都設定常量初值,那麼給予一個explicit initialization list 會比較高效(比起意義相同的constructor 的 inline expansion(內聯擴展)而言)。甚至在local scope中也是如此。編譯器


圖片5-1-2;

觀念上,咱們的Point class 有一個相關的default copy constructor、copy operator和destructor,然而它們都是無關痛癢的,並且編譯器實際上根本沒有產生它們。

(2)爲繼承作準備
繼承下的多態決議,Virtual functions的引入,每個class object 多負擔一個vptr,而且也引起編譯器對於咱們的class 產生膨脹做用:


圖片5-1-3;

注:C++ Standard 要求編譯器儘可能延遲 nontrivial members 的實際合成操做,直到真正遇到其使用場合爲止。


============================================================================
5-2. 繼承體系下的對象構造


圖片5-2-1;


圖片5-2-2;

(1)虛擬繼承
問題:對於Virtual base class 的構造,由更日後(往下)的繼承來負責「被共享之virtual base class(派生類的subobject)」的構造。
添加條件測試:只有一個完整的class object 被定義出來時,它纔會被調用;若是object只是某個完整object 的subobject,它就不會被調用。


(2)vptr初始化語意學
以下的繼承體系:


圖片5-2-3;


圖片5-2-4;


圖片5-2-5;


圖片5-2-6;

然而,這個看似完美的解決有關限制虛擬機制的問題,卻仍不完美:

圖片5-2-7;


圖片5-2-8;


============================================================================
5-3. 對象複製語意學


圖片5-3-1;


圖片5-3-2;


圖片5-3-3;

注:書中做者建議,儘量不要容許一個virtual base class 的拷貝操做。甚至:不要在任何virtual base class 中聲明數據。


============================================================================
5-5. 解構語意學


圖片5-5-1;


圖片5-5-2;


圖片5-5-3;

============================================================================

相關文章
相關標籤/搜索