深度探索C++對象模型(5)_第1頁
深度探索C++對象模型(5)_第2頁
深度探索C++對象模型(5)_第3頁
深度探索C++對象模型(5)_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

1、深度探索C+對象模型(5)最小巧、最精致、測試最完整、性價比最高的無線射頻開發(fā)平臺和模塊:NORDIC無線射頻開發(fā)平臺系列NORDIC無線射頻模塊系列最超值的ARM7/ARM9開發(fā)板系列AVR單片機(jī)開發(fā)板與仿真器上一篇我們對合成確省的構(gòu)造函數(shù)做了一個了解,這一篇我們繼續(xù)看看構(gòu)造函數(shù)這個有趣的東西. Copy Constructor是什么?我們經(jīng)??吹酱a中有一些這樣的函數(shù)調(diào)用方式X(X&) (“X of X ref”). 這個函數(shù)用用戶自定義類型作為參數(shù),那它的參數(shù)的構(gòu)造便是由Copy Constructor負(fù)責(zé)的. 可見這個玩意非常重要,實(shí)際上Copy Constructor是由編譯

2、器自動合成的,不需要你去作任何事情,但編譯器都做了些什么呢?我們的問題出來了。 我們有三種情況需要用一個對象的內(nèi)容作為另一個類對象的初值.也就是需要編譯器來為我們自動合成Copy Constructor.一種是我們在編程中肯定回用到的由類生成對象例如以下形式: class ClassA. ClassA a; ClassA b=a; /一個Class對象以另一個對象做初值 另外的一種情況是以對象為參數(shù)在函數(shù)中傳遞看下面的偽碼: /例如我們有一個CUser類 CUser CUser(); . ; /我們還有一個CDatabase類,它有一個AddNew的方法 CDatabase . public:

3、 AddNew(CUser userone); . /我們用CUser類產(chǎn)生了一個對象實(shí)例.userone,并將他作為AddNew函數(shù)的參數(shù),以便 /AddNew函數(shù)能夠完成在數(shù)據(jù)庫中增加一條記錄,用來記錄一個用戶的信息 CDatabase db=new CDatabase(); db.AddNew(CUser userone) /在這里,你不用將你的用戶類的成員全部展開. 還有一種當(dāng)然是用做函數(shù)的return,例如你可以在CDatabase類中添加一個函數(shù)用來讀取一個用戶的信息例如這樣CUser GetUserOne(int userID),通過一個用戶的唯一的編號可以獲得一個用戶的信息,并

4、返回一個CUser類的對象。 我們來看看Copy Constructor是如何工作的.首先Copy Constructor和Default Constructor一樣都是在需要的時候由編譯器產(chǎn)生出來,一個類如果沒有聲明一個Copy Constructor就會存在一個隱含的聲明(或定義),它也被分為trivial和nontrivial兩種. 我們來看書上的例子: Class Word public: Word(const char*); Word()delete str; private: int cnt; Char *str; 這個類的聲明不需要合成出Default Copy Construc

5、tor.但當(dāng)進(jìn)行如下應(yīng)用時: #include "Word.h" Word noun("lsmodel"); void foo() Word verb=noun; 結(jié)果將會出現(xiàn)災(zāi)難性的后果.為什么?因?yàn)槲覀兊倪壿媽ο髒erb和全局對象noun都指向了相同的字符串,在退出函數(shù)foo()之前verb會執(zhí)行析構(gòu), 則字符串被刪除,從此全局對象nonu指向了一堆無意義的東西.你可以聲明一個explicit copy constructor來解決這個問題,當(dāng)然還可以讓編譯器來自動的給你合成一個Copy construct. 我們將上面的Word類改寫成下面的樣子:

6、 Class Word public: Word(const String&);/注意這里和我們開始的X(X&)形式一樣 Word(); /. private: int cnt; String str; / 這個成員是String類的對象,String是我們自定義的類型 ; Class String public: String(const char*); String(const String&);/這里聲明了一個Copy constructir String(); /. 這時在執(zhí)行我們的代碼 #include "Word.h" Word noun

7、("lsmodel"); void foo() Word verb=noun; 編譯器會為我們的Word類合成一個Copy Constructor,用來調(diào)用它的str(member class String object)的Copy Constructor.象下面?zhèn)未a表示的這樣: inline Word:Word(const Word &wd) str.String:String(wd.str); cnt=t; 當(dāng)這個類中有一個或多個虛函數(shù)時,或者這個類是派生于一個繼承串鏈,并且這個串中有一個或多個虛擬的基類時.這個類在進(jìn)行拷貝時便不會展現(xiàn)逐次拷貝 (bitwise

8、 copy).并且會通過合成的Copy Constructor來重新明確的設(shè)定vptr來指向虛函數(shù)表,而不是將右邊對象的vprt直接拷貝過來.書上的ZooAnimal例子的圖可以很清晰的描述出這點(diǎn)。 如果一個對象以另一個對象做初值,而后者有一個Virtual Base Class Subobject,那會怎樣呢?任何一個編譯器都會做到在派生類對象中的virtual base class Subobject的位置在執(zhí)行期就準(zhǔn)備妥當(dāng),但bitwise copy可能會破壞這一位置,因此也需要由編譯器合成出一個copy constructor,來安插一些代碼來設(shè)定virtual base class

9、pointer/offset,對每一個成員執(zhí)行必要的memberwise初始化操作,以及執(zhí)行內(nèi)存相關(guān)的工作。 最后我們來總結(jié)一下上面說的內(nèi)容,確實(shí)有些亂.雷神越來越覺得自己的缺乏文字描述能力. 我們這篇學(xué)習(xí)的內(nèi)容是:當(dāng)一個對象以另一個對象作為初始值時,會發(fā)生什么事情. 分成了兩種情況,一種是我們聲明了explicit copy constructor,這個不是這篇文章需要搞明白的(我想大家也都很明白了).我們想知道的是我們沒有為class聲明explicit copy constructor函數(shù)時編譯器都干了些什么.編譯器會為我們合成一個copy constructor.以便適應(yīng)任何時候的對象被正確的初始化.并且我們了解了有以下四種情況class不在按位逐一進(jìn)行拷貝. 1.當(dāng)你設(shè)計(jì)的類聲明了一個explicit copy constructor

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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

提交評論