版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、讀書筆記讀書筆記《深度探索深度探索c對象模型對象模型》(1)收藏第二章:構(gòu)造函數(shù)語意學(xué)第二章:構(gòu)造函數(shù)語意學(xué)2.1defaultconstruct的構(gòu)建操作的構(gòu)建操作c標(biāo)準(zhǔn)說:對于classX,如果沒有任何程序員聲明的構(gòu)造函數(shù),那么編譯編譯器會器會implicitly(暗中)合成出一個(暗中)合成出一個trivial(無能的,沒啥用的)(無能的,沒啥用的)構(gòu)造函數(shù)。(備注:(備注:globalobjects的內(nèi)存在程序激活的時候會被清的
2、內(nèi)存在程序激活的時候會被清0。localobjects位于程序的堆棧中,位于程序的堆棧中,heapobjects位于自由空間中,都不一定會位于自由空間中,都不一定會被清被清0。它們的內(nèi)容是內(nèi)存上次被使用之后的遺跡。)。它們的內(nèi)容是內(nèi)存上次被使用之后的遺跡。)但是,有四種情況,這個被implicitly合成出的函數(shù),會是nontrivival(有用的)。a)帶有)帶有defaultconstruct的memberclassobject例如
3、:viewplaincopytoclipboardprint1.classA2.public:3.A()4.5.6.classB7.public:8.private:9.Aa10.inti11.12.13.B::B()14.a.A::A()15.被合成的被合成的classB的defaultconstructi內(nèi)含有必要的代碼,這些代碼調(diào)用了內(nèi)含有必要的代碼,這些代碼調(diào)用了classA的defaultconstruct。但是,并不會產(chǎn)生初
4、始化。但是,并不會產(chǎn)生初始化i的代碼。的代碼。所以說,被合成的defaultconstruct只符合編譯器的需要,不符合程序員的需要。如果如果B已經(jīng)有程序員定義的構(gòu)造函數(shù),那么已經(jīng)有程序員定義的構(gòu)造函數(shù),那么每個構(gòu)造函數(shù)都會被編譯器擴張每個構(gòu)造函數(shù)都會被編譯器擴張,在其中安插,在其中安插一些代碼,這些代碼在一些代碼,這些代碼在usercode執(zhí)行之前,會調(diào)用必要的執(zhí)行之前,會調(diào)用必要的defaultconstruct。并且,如果并且,如
5、果classB中有多個中有多個classmemberobjects需要需要construct的初始化的初始化操作。那么操作。那么c會按照聲明的順序來調(diào)用各個會按照聲明的順序來調(diào)用各個construct。例如:viewplaincopytoclipboardprint1.classA2.public:3.A()4.在帶有defaultconstruct的memberclassobject,那么這些member的defaultconstru
6、ct也會被調(diào)用——在所有baseclassconstruct被調(diào)用之后。c)帶有一個)帶有一個virtualfunction的class我們知道,一個帶有virtualfunction的class的每一個object中,一個vptr會被合成出來,內(nèi)含相關(guān)classvtbl的地址。為了讓多態(tài)的機制發(fā)揮功效,編譯器會為vptr設(shè)定初始值。對于每一個construct,它們會被安插一些代碼來做這件事情。如果沒有聲明任何construct,那么
7、合成的defaultconstruct會初始化每一個classobject的vptr。d)帶有)帶有virtualbaseclass的classvirtualbaseclass的實現(xiàn)在不同的編譯器中有很大的差異。但是它們的共同點是:必的實現(xiàn)在不同的編譯器中有很大的差異。但是它們的共同點是:必須使每一個須使每一個virtualbaseclass在其每一個在其每一個derivedclassobject中的位置,必須中的位置,必須在執(zhí)行期準(zhǔn)備
8、妥當(dāng)。在執(zhí)行期準(zhǔn)備妥當(dāng)。viewplaincopytoclipboardprint1.classXpublicx2.classA:publicvirtualpublic:inta3.classB:publicvirtualpublic:intb4.classC:publicApublicBpublic:intc5.voidfoo(constApa)6.pai=10247.8.intmain()9.foo(newA)10.foo(newC
9、)11.return012.編譯器是無法決定foo中i的偏移位置的。因為pa的真正類型在執(zhí)行期間可以改變。所以編譯器必須改變一些代碼使得X::x的位置可以在執(zhí)行期才被決定。一種做法是:一種做法是:在derivedclassobject的每一個的每一個virtualbaseclass中安插一個指針,表示在當(dāng)前中安插一個指針,表示在當(dāng)前object中,該中,該virtualbaseclass的位置。的位置。viewplaincopytocl
10、ipboardprint1.voidfoo(constApa)2.pa__vbcXi=10243.__vbcX是編譯器產(chǎn)生的指針,指向virtualbaseclassX。這個指針是在編譯時期構(gòu)建的。對于class定義的每一個construct,編譯器會安插那些“允許每一個virtualbaseclass的執(zhí)行期存取操作”的代碼。如果class沒有聲明任何construct,那么編譯器會合成一個defaultconstruct來做這些事情
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論