Boolan - C++學習筆記 二 - 第二周

C++程序設計(2)


第二周筆記

1 對象模型(object model)

1.1 關于虛指針(virtual point)和虛表(virtual table)

每個具有虛函數的類的對象都有一個虛指針vptr,該指針指向虛函數表vtble,該表存放了類的所有虛函數地址,即改數組是函數指針數組。

如果類A派生B,同時B重寫了A的虛函數A::fun(),此時類B的對象B

b,b具有虛指針,指向類B的虛函數表,同時,A::fun()位置被重寫的函數B::fun()替換掉,如圖中B::vfunc1()所示。

C++編譯器對于函數的處理,考慮靜態綁定(普通函數)和動態綁定或虛機制(虛函數)。

動態綁定必須是用對象指針來訪問對象成員,編譯成下面所示內容,在程序執行過程中,根據P所指的對象是基類還是派生類成員來決定調用哪一個類的函數。這就現實了多態。


1.2 關于this指針

用This指針來實現模板方法,注意:不是模板函數。

所有非靜態成員函數都隱式含有this指針。This指向當前對象。

myDoc.OnFileOpen()

等價于:Cdocument::OnFileOpen&myDoc);

OnFileOpen()是類Cdocument的成員函數。

This->Serialize()//Serizlize()是虛函數,因此

等價于:(*(this->vptr)[n])(this)


動態綁定的三個條件:

A* pa = new B;

pa->vfun();

1、通過指針來訪問

2、訪問虛函數

3、向上轉型up-cast

關于Const關鍵字

Const是函數簽名(signature)的一部分。

1、常成員函數:表示函數不能修改類成員變量的值,同時也不能調用可以修改類成員變量值的成員函數。

int getX () const{ return this -> x };

常對象,只能調用類的常成員函數。

ConstString str(“Hello World\n”);

str.print();

str.setX(intx);//can not complie successfully.

2、修飾函數參數void* strcpy(void* dst, const void* src);

3、定義只讀變量const intx = 100;

關于New和delete

new和delete都是C++運算符,注:不是函數;

malloc()和free()才是函數。

New和delete內部是分別調用malloc和free函數來實現的。

重載之后的new和delete參數是有編譯器傳進來的。

下圖是全局重載,影響非常大。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容