Boolan_C++面向?qū)ο蟾呒壘幊蹋ㄏ拢第二周筆記

1、 對象模型:關(guān)于vptr(虛函數(shù)表指針)和vtbl(虛函數(shù)表)

1.1 課堂內(nèi)容總結(jié)

關(guān)于vptr和vtbl(1)
關(guān)于vptr和vtbl(2)

(1)class中有虛函數(shù)時,對象中會多一個指針,0x409004,內(nèi)存會多四字節(jié);

(2)classB繼承classA,classB有自己的vfunc1(),有classA的vfunc2(),classC繼承classB,classC有自己的vfunc1(),有classB的vfunc2()(也就是classA的vfunc2());

(3)繼承是繼承的調(diào)用權(quán),不是內(nèi)存大?。?/p>

(4)父類有虛函數(shù),子類肯定有虛函數(shù);

(5)子類中函數(shù)與父類同名,但不是一個函數(shù)。

1.2 課后補充學(xué)習(xí)

如果一個類包含了一個虛函數(shù),那么編譯器就會為該類產(chǎn)生一個虛擬函數(shù)表vtbl,該表是類級別的,即該類的所有對象共享同一個vtbl,且向該類的對象中安插一個指針,指向該虛函數(shù)表。例如:

class A

{

public:

virtual void foo();

};

A a,b;

那么對象a,b的內(nèi)存中各有一個vptr,他們的值就是虛函數(shù)表的地址。

再考慮下面的情況:class B:public A{ };

那么類B有虛函數(shù)表嗎?有,而且B的虛函數(shù)表和A的虛函數(shù)表不一樣,也就是說,不同的類有不同的虛函數(shù)表。在上面的情況,B的虛函數(shù)表中的虛函數(shù)地址和A的是一樣的,但是還是要為B產(chǎn)生一個虛函數(shù)表。

2、對象模型:關(guān)于this

2.1 課堂內(nèi)容總結(jié)

關(guān)于this

(1)將常規(guī)的同一不變的放在onfileopen()中,將特殊的放在serialize()中;

(2)CDocument::OnFileOpen(&myDoc)中“&myDoc”為this,當(dāng)this指子類就符合向上轉(zhuǎn)型(保證安全);

(3)C++中所有成員函數(shù)中一定有this參數(shù)。

2.2 課后補充學(xué)習(xí)

一個對象的this指針并不是對象本身的一部分,不會影響sizeof(對象)的結(jié)果。this作用域是在類內(nèi)部,當(dāng)在類的非靜態(tài)成員函數(shù)中訪問類的非靜態(tài)成員的時候,編譯器會自動將對象本身的地址作為一個隱含參數(shù)傳遞給函數(shù)。也就是說,即使你沒有寫上this指針,編譯器在編譯的時候也是加上this的,它作為非靜態(tài)成員函數(shù)的隱含形參,對各成員的訪問均通過this進(jìn)行。

例如,調(diào)用date.SetMonth(9) <===> SetMonth(&date, 9),this幫助完成了這一轉(zhuǎn)換 。

this的用法:一種情況就是,在類的非靜態(tài)成員函數(shù)中返回類對象本身的時候,直接使用 return *this;另外一種情況是當(dāng)參數(shù)與成員變量名相同時使用this指針,如this->n = n (不能寫成n = n)。

更多更詳細(xì)的關(guān)于this的介紹見guirenwang的博客:http://blog.csdn.net/guirenwang/article/details/2611355

3、對象模型:關(guān)于Dynamic Binding

3.1 課堂內(nèi)容總結(jié)

靜態(tài)綁定


動態(tài)綁定

(1)靜態(tài)綁定一定是綁定某個地址;

(2)動態(tài)綁定的三個條件:通過指針調(diào)用,指針是向上轉(zhuǎn)型,調(diào)用的是虛函數(shù)。

3.2 課后補充學(xué)習(xí)

對象的靜態(tài)類型:對象在聲明時采用的類型。是在編譯期確定的。對象的動態(tài)類型:目前所指對象的類型。是在運行期決定的。對象的動態(tài)類型可以更改,但是靜態(tài)類型無法更改。

靜態(tài)綁定:綁定的是對象的靜態(tài)類型,某特性(比如函數(shù))依賴于對象的靜態(tài)類型,發(fā)生在編譯期。動態(tài)綁定:綁定的是對象的動態(tài)類型,某特性(比如函數(shù))依賴于對象的動態(tài)類型,發(fā)生在運行期。

如何區(qū)分遺憾語句調(diào)用的是否為同一個函數(shù),詳見常高偉的博客:http://blog.csdn.net/chgaowei/article/details/6427731

4、const

對于const與non-const的變量和成員函數(shù),最重要的是下表:

const與non-const的變量和成員函數(shù)配對

由上表可知,當(dāng)成員函數(shù)的const和non-const版本同時存在時,const object只能調(diào)用const版本,non-const object只能調(diào)用non-const版本。

5、重載new(),delete()

5.1 課堂內(nèi)容總結(jié)

重載new(),delete()

5.2課后補充學(xué)習(xí)

(1)局部重載new和delete

局部重載new和delete,可以使用成員函數(shù)和友元函數(shù)兩種方式重載。使用new分配某個重載了new的累的對象空間時,先調(diào)用new的重載函數(shù),再調(diào)用該類的構(gòu)造函數(shù),如果該類的構(gòu)造函數(shù)有參數(shù)要求,則必須給出對應(yīng)的實參。使用了delete釋放某個重載了delete的累的對象空間時,先調(diào)用類的析構(gòu)函數(shù),然后再調(diào)用重載的delete函數(shù)。

(2)全局重載new和delete

可以在任何類說明之外重在new和delete,使它們成為全局的。當(dāng)new和delete被重載為全局時,C++原來的new與delete被忽略,并且重載的運算符用于所有類型(包括標(biāo)準(zhǔn)型和用戶定義類型)的分配要求。

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

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

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