c++講解_第1頁(yè)
已閱讀1頁(yè),還剩22頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、讀書筆記讀書筆記《深度探索深度探索c對(duì)象模型對(duì)象模型》(1)收藏第二章:構(gòu)造函數(shù)語(yǔ)意學(xué)第二章:構(gòu)造函數(shù)語(yǔ)意學(xué)2.1defaultconstruct的構(gòu)建操作的構(gòu)建操作c標(biāo)準(zhǔn)說(shuō):對(duì)于classX,如果沒有任何程序員聲明的構(gòu)造函數(shù),那么編譯編譯器會(huì)器會(huì)implicitly(暗中)合成出一個(gè)(暗中)合成出一個(gè)trivial(無(wú)能的,沒啥用的)(無(wú)能的,沒啥用的)構(gòu)造函數(shù)。(備注:(備注:globalobjects的內(nèi)存在程序激活的時(shí)候會(huì)被清的

2、內(nèi)存在程序激活的時(shí)候會(huì)被清0。localobjects位于程序的堆棧中,位于程序的堆棧中,heapobjects位于自由空間中,都不一定會(huì)位于自由空間中,都不一定會(huì)被清被清0。它們的內(nèi)容是內(nèi)存上次被使用之后的遺跡。)。它們的內(nèi)容是內(nèi)存上次被使用之后的遺跡。)但是,有四種情況,這個(gè)被implicitly合成出的函數(shù),會(huì)是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。但是,并不會(huì)產(chǎn)生初

4、始化。但是,并不會(huì)產(chǎn)生初始化i的代碼。的代碼。所以說(shuō),被合成的defaultconstruct只符合編譯器的需要,不符合程序員的需要。如果如果B已經(jīng)有程序員定義的構(gòu)造函數(shù),那么已經(jīng)有程序員定義的構(gòu)造函數(shù),那么每個(gè)構(gòu)造函數(shù)都會(huì)被編譯器擴(kuò)張每個(gè)構(gòu)造函數(shù)都會(huì)被編譯器擴(kuò)張,在其中安插,在其中安插一些代碼,這些代碼在一些代碼,這些代碼在usercode執(zhí)行之前,會(huì)調(diào)用必要的執(zhí)行之前,會(huì)調(diào)用必要的defaultconstruct。并且,如果并且,如

5、果classB中有多個(gè)中有多個(gè)classmemberobjects需要需要construct的初始化的初始化操作。那么操作。那么c會(huì)按照聲明的順序來(lái)調(diào)用各個(gè)會(huì)按照聲明的順序來(lái)調(diào)用各個(gè)construct。例如:viewplaincopytoclipboardprint1.classA2.public:3.A()4.在帶有defaultconstruct的memberclassobject,那么這些member的defaultconstru

6、ct也會(huì)被調(diào)用——在所有baseclassconstruct被調(diào)用之后。c)帶有一個(gè))帶有一個(gè)virtualfunction的class我們知道,一個(gè)帶有virtualfunction的class的每一個(gè)object中,一個(gè)vptr會(huì)被合成出來(lái),內(nèi)含相關(guān)classvtbl的地址。為了讓多態(tài)的機(jī)制發(fā)揮功效,編譯器會(huì)為vptr設(shè)定初始值。對(duì)于每一個(gè)construct,它們會(huì)被安插一些代碼來(lái)做這件事情。如果沒有聲明任何construct,那么

7、合成的defaultconstruct會(huì)初始化每一個(gè)classobject的vptr。d)帶有)帶有virtualbaseclass的classvirtualbaseclass的實(shí)現(xiàn)在不同的編譯器中有很大的差異。但是它們的共同點(diǎn)是:必的實(shí)現(xiàn)在不同的編譯器中有很大的差異。但是它們的共同點(diǎn)是:必須使每一個(gè)須使每一個(gè)virtualbaseclass在其每一個(gè)在其每一個(gè)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.編譯器是無(wú)法決定foo中i的偏移位置的。因?yàn)閜a的真正類型在執(zhí)行期間可以改變。所以編譯器必須改變一些代碼使得X::x的位置可以在執(zhí)行期才被決定。一種做法是:一種做法是:在derivedclassobject的每一個(gè)的每一個(gè)virtualbaseclass中安插一個(gè)指針,表示在當(dāng)前中安插一個(gè)指針,表示在當(dāng)前object中,該中,該virtualbaseclass的位置。的位置。viewplaincopytocl

10、ipboardprint1.voidfoo(constApa)2.pa__vbcXi=10243.__vbcX是編譯器產(chǎn)生的指針,指向virtualbaseclassX。這個(gè)指針是在編譯時(shí)期構(gòu)建的。對(duì)于class定義的每一個(gè)construct,編譯器會(huì)安插那些“允許每一個(gè)virtualbaseclass的執(zhí)行期存取操作”的代碼。如果class沒有聲明任何construct,那么編譯器會(huì)合成一個(gè)defaultconstruct來(lái)做這些事情

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論