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參數是有編譯器傳進來的。
下圖是全局重載,影響非常大。