C++程序設(shè)計(jì)(2)
第二周筆記
1 對(duì)象模型(object model)
1.1 關(guān)于虛指針(virtual point)和虛表(virtual table)

每個(gè)具有虛函數(shù)的類的對(duì)象都有一個(gè)虛指針vptr,該指針指向虛函數(shù)表vtble,該表存放了類的所有虛函數(shù)地址,即改數(shù)組是函數(shù)指針數(shù)組。
如果類A派生B,同時(shí)B重寫了A的虛函數(shù)A::fun(),此時(shí)類B的對(duì)象B
b,b具有虛指針,指向類B的虛函數(shù)表,同時(shí),A::fun()位置被重寫的函數(shù)B::fun()替換掉,如圖中B::vfunc1()所示。
C++編譯器對(duì)于函數(shù)的處理,考慮靜態(tài)綁定(普通函數(shù))和動(dòng)態(tài)綁定或虛機(jī)制(虛函數(shù))。
動(dòng)態(tài)綁定必須是用對(duì)象指針來訪問對(duì)象成員,編譯成下面所示內(nèi)容,在程序執(zhí)行過程中,根據(jù)P所指的對(duì)象是基類還是派生類成員來決定調(diào)用哪一個(gè)類的函數(shù)。這就現(xiàn)實(shí)了多態(tài)。

1.2 關(guān)于this指針
用This指針來實(shí)現(xiàn)模板方法,注意:不是模板函數(shù)。
所有非靜態(tài)成員函數(shù)都隱式含有this指針。This指向當(dāng)前對(duì)象。
如myDoc.OnFileOpen()
等價(jià)于:Cdocument::OnFileOpen(&myDoc);
OnFileOpen()是類Cdocument的成員函數(shù)。
This->Serialize()//Serizlize()是虛函數(shù),因此
等價(jià)于:(*(this->vptr)[n])(this)

動(dòng)態(tài)綁定的三個(gè)條件:
A* pa = new B;
pa->vfun();
1、通過指針來訪問
2、訪問虛函數(shù)
3、向上轉(zhuǎn)型up-cast
關(guān)于Const關(guān)鍵字
Const是函數(shù)簽名(signature)的一部分。

1、常成員函數(shù):表示函數(shù)不能修改類成員變量的值,同時(shí)也不能調(diào)用可以修改類成員變量值的成員函數(shù)。
int getX () const{ return this -> x };
常對(duì)象,只能調(diào)用類的常成員函數(shù)。
ConstString str(“Hello World\n”);
str.print();
str.setX(intx);//can not complie successfully.
2、修飾函數(shù)參數(shù)void* strcpy(void* dst, const void* src);
3、定義只讀變量const intx = 100;
關(guān)于New和delete
new和delete都是C++運(yùn)算符,注:不是函數(shù);
malloc()和free()才是函數(shù)。
New和delete內(nèi)部是分別調(diào)用malloc和free函數(shù)來實(shí)現(xiàn)的。
重載之后的new和delete參數(shù)是有編譯器傳進(jìn)來的。
下圖是全局重載,影響非常大。
