1、 對象模型:關(guān)于vptr(虛函數(shù)表指針)和vtbl(虛函數(shù)表)
1.1 課堂內(nèi)容總結(jié)
(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é)
(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é)
(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ù),最重要的是下表:
由上表可知,當(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é)
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)型和用戶定義類型)的分配要求。