深度探索C 物件模型筆記 第五章

2021-09-26 20:12:23 字數 2213 閱讀 9457

inline和define

內聯函式在編譯時展開,而巨集是由預處理器對巨集進行展開

內聯函式會檢查引數型別,巨集定義不檢查函式引數 ,所以內聯函式更安全。

巨集不是函式,而inline函式是函式

巨集在定義時要小心處理巨集引數,可能出現二義性(一般情況是把引數用括弧括起來)。

const常量有資料型別,而巨集常量沒有資料型別;編譯器可以對const進行型別安全檢查,而對後者只能進行字元替換,沒有安全檢查,並且在字元替換時可能會產生意料不到的錯誤;有些整合化的除錯工具可以對const常量進行除錯, 在 c++程式中只使用const常量而不使用巨集常量,即const常量完全取代巨集常量。

可以定義和呼叫乙個純虛函式,不過它只能靜態地呼叫,不能經由虛擬機制呼叫。例如,可以合法地寫下這段**:

class abstract_base

class concrete_derived:public abstract_base

inline void abstract_base::inte***ce()

inline void concrete_derived::inte***ce()

要不要這樣做,全由class設計者決定。唯一例外的就是pure virtual destructor:class的設計者一定要定義它。為什麼?因為每乙個derived class destructor會被編譯器加以擴張,以靜態呼叫的方式呼叫其「每乙個virtual base class」以及「上一層base class」的destructor。因此,只要缺乏任何乙個base class destructor的定義,就會導致鏈結失敗

不要把virtual destructor申明為pure

plain old data (pod)

pod指的是這樣一些資料型別:基本資料型別、指標、union、陣列、建構函式是 trivial 的 struct 或者 class。

pod用來表明c++中與c相相容的資料型別,可以按照c的方式來處理(運算、拷貝等)。非pod資料型別與c不相容,只能按照c++特有的方式進行使用。

typedef struct

point;

point global;(1

)point foobar()

編譯器會被point貼上pod標籤,對於foobar()函式中的l5,有乙個point object local,既沒有被構造也沒有被析構,對於l6會被轉換為對new運算子的呼叫,但是並沒有預設建構函式施行於new運算子所傳回的point object身上,l7會報錯,因為local是未初始化物件

一般而言,如果你的設計中有許多函式需要以傳值方式傳回乙個local class object,那麼提供乙個copy constructor比較合理,它的出現會觸發named return value(nrv)優化。然而,nrv優化後將不再需要呼叫copy constructor,因為運算結果已經被直接計算於「將被傳回的object」體內了

vertex和point3d的建構函式必須呼叫point的建構函式,然而,當point3d和vertex同為vertex3d的subobjects時,它們對point的建構函式的呼叫操作一定不可以發生,取而代之的是,作為乙個最底層的class,vertex3d有責任將point初始化。而更往後(往下)的繼承,則由pvertex(不再是vertex3d)來負責完成「被共享之point subobject」的構造

如果class沒有定義析構函式,那麼只有在class內含的member object(亦或class自己的base class)擁有析構函式的情況下,編譯器才會自動合成乙個出來。否則,即使有虛函式析構函式也會被視為不需要,不會合成

析構函式的順序

1 析構函式的本體先執行

2 如果class擁有哦member class objects,而後者擁有析構函式,那麼它們會以其宣告順序的相反順序被呼叫

3 如果object內含乙個vptr,現在被重新設定,指向適當之base class的virtual table

4 如果有任何直接的(上一層)nonvirtual base classes 擁有析構函式,它們會以其宣告順序的相反順序被呼叫

5 如果有任何virtual base classes擁有析構函式,而目前討論的這個class 是最尾端(most-derived)的class,那麼它們會以其原來的構造順序的相反順序被呼叫

第五章 適用物件

第一節 字元型別 單個的字元 char public class main 輸出3 字元 char 和整數 int 可以互相轉換 大小寫轉換 1.大寫 小寫 public class main 2.小寫到大寫 public class main 第二節包裹型別 基礎型別 boolean char i...

深度探索C 物件模型之C 物件模型筆記

0.菜鳥覺得,在看這本書的時候最好切換角色,把自己的思維轉換成編譯器開發者,去考慮問題,這樣會容易理解些.當然這樣很難,就想著自己要解決什麼樣的問題好了 1.在c 中,類的資料成員有兩種 靜態和非靜態 成員函式有三種 靜態,非靜態 虛函式。之所以這樣分,大概是因為在設計c 物件模型時,非靜態的資料成...

第五章 盒子模型

5.1 元素分類 常用的塊狀元素有 div p h1 h6 ol ul li dl dt table form 常用的內聯元素有 a span i em strong label 常見的內聯塊狀元素有 input img 標籤分類的特點是對現有的html常用標籤進行分類,那麼這些特點在後面的學習過程...