C++對(duì)象模型
- (32位系統(tǒng)中)對(duì)于類成員如果是空類占1個(gè)字節(jié),如果有虛函數(shù)谓媒,每個(gè)虛函數(shù)會(huì)有一個(gè)vptr指針占4個(gè)字節(jié)淆院,如果有靜態(tài)類成員變量,其在global date memory中句惯,在類實(shí)例化中不單獨(dú)占用內(nèi)存土辩。類的成員函數(shù)不占用類的大小。
類在內(nèi)存中占用的空間與成員變量的順序也有關(guān)系抢野。同時(shí)遵循數(shù)據(jù)對(duì)齊原則拷淘。 - 如果函數(shù)沒有使用關(guān)鍵字virtual修飾,則程序?qū)⒏鶕?jù)對(duì)象指孤、引用類型或指針類型調(diào)用函數(shù)启涯。如果使用virtual修飾函數(shù)則程序?qū)⒏鶕?jù)引用或者指針 指向的對(duì)象類型 進(jìn)行選擇方法。但是將函數(shù)定義成virtual會(huì)增加程序的空間和時(shí)間開銷恃轩。在基類方法的聲明中使用關(guān)鍵字virtual可是該方法在基類以及所有的派生類(包括從派生類派生出來的類)中是虛的结洼。
每一個(gè)包含虛函數(shù)的類都有一個(gè)隱含的vptr指針(不論有幾個(gè)虛函數(shù)都只有一個(gè)指針),指向vtbl(虛函數(shù)表叉跛,有幾個(gè)虛函數(shù)虛函數(shù)表就包括幾個(gè)函數(shù)指針)松忍,而虛函數(shù)表指向具體的實(shí)現(xiàn)函數(shù)的入口地址。 - 為基類聲明一個(gè)虛析構(gòu)函數(shù)是一種慣例(除非它不做基類)筷厘,這樣可以確保釋放派生對(duì)象時(shí)按正確的順序調(diào)用析構(gòu)函數(shù)鸣峭。如果虛構(gòu)函數(shù)不是虛的則指揮調(diào)用指針類型的析構(gòu)函數(shù),而不會(huì)調(diào)用指針指向的類型的析構(gòu)函數(shù)酥艳,這樣會(huì)出現(xiàn)錯(cuò)誤摊溶。
- 在派生類中的虛函數(shù)調(diào)用基類的同名虛函數(shù)時(shí)需要使用基類類名域作用符,否則會(huì)出現(xiàn)無限循環(huán)調(diào)用充石。
- 成員函數(shù)的const 和non-const版本構(gòu)成函數(shù)的重載莫换;但是返回值類型不構(gòu)成重載。當(dāng)成員函數(shù)同時(shí)存在兩種版本時(shí)赫冬,const object只能調(diào)用const版本浓镜,non-const object只能調(diào)用non-const版本。
- new表達(dá)式的作用步驟:
1.調(diào)用operator new或者operator new[]標(biāo)準(zhǔn)庫(kù)函數(shù)劲厌,分配內(nèi)存空間
2.運(yùn)行相應(yīng)構(gòu)造器構(gòu)造對(duì)象
3.返回指向該對(duì)象的指針 - delete表達(dá)式的作用步驟:
1.對(duì)指針指向的對(duì)象執(zhí)行析構(gòu)函數(shù)
2.調(diào)用名為operator delete或者operator delete[]的庫(kù)函數(shù)釋放內(nèi)存空間。 - 因?yàn)閚ew發(fā)生的對(duì)象構(gòu)造之前听隐,delete發(fā)生在對(duì)象銷毀之后补鼻,所以這兩個(gè)重載的成員函數(shù)都是隱式靜態(tài)的,他們不能操作類的任何數(shù)據(jù)成員。
關(guān)于new與delete的重載