Boolan - C++學(xué)習(xí)筆記 二 - 第二周

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)來的。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容