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)存大型辽啊州既;
(4)父類有虛函數(shù),子類肯定有虛函數(shù)萝映;
(5)子類中函數(shù)與父類同名吴叶,但不是一個函數(shù)。
1.2 課后補(bǔ)充學(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 課后補(bǔ)充學(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 課后補(bǔ)充學(xué)習(xí)
對象的靜態(tài)類型:對象在聲明時采用的類型撒顿。是在編譯期確定的。對象的動態(tài)類型:目前所指對象的類型荚板。是在運(yùn)行期決定的凤壁。對象的動態(tài)類型可以更改,但是靜態(tài)類型無法更改啸驯。
靜態(tài)綁定:綁定的是對象的靜態(tài)類型客扎,某特性(比如函數(shù))依賴于對象的靜態(tài)類型,發(fā)生在編譯期罚斗。動態(tài)綁定:綁定的是對象的動態(tài)類型徙鱼,某特性(比如函數(shù))依賴于對象的動態(tài)類型,發(fā)生在運(yùn)行期针姿。
如何區(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課后補(bǔ)充學(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被忽略歹茶,并且重載的運(yùn)算符用于所有類型(包括標(biāo)準(zhǔn)型和用戶定義類型)的分配要求夕玩。