1.關(guān)于vptr和vtbl
對(duì)象內(nèi)存的問(wèn)題,結(jié)合上個(gè)星期的題目彼哼,當(dāng)子類(lèi)繼承父類(lèi)的時(shí)候,子類(lèi)會(huì)繼承父類(lèi)的私有成員變量湘今,當(dāng)一個(gè)類(lèi)有虛擬函數(shù)的時(shí)候敢朱,函數(shù)會(huì)多一個(gè)虛擬指針,用來(lái)指向虛擬表,當(dāng)父類(lèi)為虛擬類(lèi)的時(shí)候蔫饰,它的子類(lèi)也必定是虛擬類(lèi)琅豆。所以繼承函數(shù)其實(shí)是繼承了函數(shù)的調(diào)用權(quán)。
(*(p->vptr)[n])(p)篓吁,這個(gè)表達(dá)式是當(dāng)我們調(diào)用某個(gè)虛函數(shù)的時(shí)候編譯器翻譯成的語(yǔ)言表達(dá)式茫因。其中n表示的時(shí)候虛函數(shù)表中調(diào)用的函數(shù)的位置。
多態(tài)
指針的聲明是父類(lèi)的大小杖剪,在具體對(duì)象的時(shí)候指向不同的子類(lèi)冻押,達(dá)到了指針大小相同,但可以調(diào)用不同子類(lèi)中的函數(shù)盛嘿,達(dá)到了取不同對(duì)象中相同的部分形成數(shù)組的目的洛巢。
2.關(guān)于this
誰(shuí)調(diào)用這個(gè)函數(shù)誰(shuí)就是this,在設(shè)計(jì)模式template method模板方法中次兆,提前寫(xiě)好所有部分稿茉,但其中用到了一個(gè)虛函數(shù),你只需要在子類(lèi)中重載該虛函數(shù)芥炭,就可以達(dá)到想要的效果漓库。
3.關(guān)于dynamic binding動(dòng)態(tài)綁定
A a = (A)b;
a.vfunc1();
這是靜態(tài)調(diào)用
A* pa = new B;
Pa->vfunc1();
動(dòng)態(tài)綁定的三個(gè)條件,指針园蝠,向上轉(zhuǎn)換渺蒿,調(diào)用了虛函數(shù)。
4.const
const member function常量成員函數(shù)
在函數(shù)的后頭加const意思是修飾成員函數(shù)不會(huì)改變data members
這里只有一種情況會(huì)出錯(cuò)彪薛,當(dāng)聲明的對(duì)象本身是const的時(shí)候茂装,他調(diào)用了non-const member functions會(huì)出錯(cuò)。而non-const member
function可以調(diào)用const member function善延,反之則不行少态,即const member function只能調(diào)用const member functions.
Char T
Operator[](size_type pos) const {}
reference
Operator[] (size_type pos) {}
Const不需要考慮copy on write
拷貝的時(shí)候,他們可以共享內(nèi)容易遣,當(dāng)一個(gè)人改變的時(shí)候彼妻,單獨(dú)拷貝一份給它,如果調(diào)用中括號(hào)的人是一個(gè)常量字符串训挡,他絕對(duì)不會(huì)做cow
當(dāng)成員函數(shù)的const和non-const版本同時(shí)存在的時(shí)候澳骤,const
obj只會(huì)調(diào)用const版本,non-const obj只會(huì)調(diào)用non-obj版本澜薄。
5.關(guān)于new delete
之前講過(guò)为肮,new分為三步,首先分配內(nèi)存肤京,在調(diào)用ctor
delete分為兩步颊艳,首先調(diào)用dtor茅特,再釋放內(nèi)存。
6.重載operator new和operator delete
分為兩部分棋枕,包括重載全局的operator new和operator delete以及重載成員的operator new, operator delete
當(dāng)沒(méi)有重載過(guò)成員的上述兩個(gè)函數(shù)白修,New會(huì)自動(dòng)調(diào)用全局的::operator new,還有一種強(qiáng)制調(diào)用全局的方法重斑。
講到了數(shù)組里面有對(duì)象的大小兵睛,這個(gè)數(shù)組的大小應(yīng)該是所有對(duì)象大小的和加上一開(kāi)始有一個(gè)常數(shù)來(lái)表示該數(shù)組有幾個(gè)元素。
在重載class member operator new的時(shí)候窥浪,我們可以寫(xiě)出多個(gè)版本祖很,第一個(gè)參數(shù)必須是size_t,其余的用new中制定的placement argument為初值漾脂。我們也可以重載class member operator delete(),并寫(xiě)出多個(gè)版本假颇,但他們不會(huì)被delete調(diào)用,只有當(dāng)new所調(diào)用的ctor有異常的時(shí)候骨稿,我們需要釋放之前分配的內(nèi)存笨鸡,就會(huì)調(diào)用對(duì)應(yīng)的operator delete,因?yàn)槲覀冊(cè)赿elete的時(shí)候不會(huì)加argument
也不是所有的operator new都要寫(xiě)對(duì)應(yīng)的delete坦冠,這時(shí)候你的意思是放棄處理這種異常形耗。