下載本文檔
版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025標(biāo)準(zhǔn)版?zhèn)€人購房合同書
- 2025合伙買車合同
- 2024-2025學(xué)年新教材高中生物 第二章 基因和染色體的關(guān)系 微專題四 伴性遺傳的解題方法說課稿 新人教版必修第二冊
- 預(yù)制樓板施工方案
- 肇慶鋼板樁支護(hù)施工方案
- 別墅電梯出售合同范例
- 2023九年級數(shù)學(xué)下冊 第二十九章 投影與視圖29.1 投影第2課時 正投影說課稿 (新版)新人教版001
- 2024年四年級英語上冊 Unit 3 Let's Go Lesson 15 In the City說課稿 冀教版(三起)
- 自然補(bǔ)償管道施工方案
- 2024年四年級英語上冊 Unit 1 My classroom The fifth period(第五課時)說課稿 人教PEP
- 2025年熱管換熱氣行業(yè)深度研究分析報(bào)告
- 職業(yè)學(xué)院學(xué)生晚出、晚歸、不歸管理辦法
- 2025年陜西西安市經(jīng)濟(jì)技術(shù)開發(fā)區(qū)管委會招聘30人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025山東能源集團(tuán)中級人才庫選拔高頻重點(diǎn)提升(共500題)附帶答案詳解
- 《安利蛋白質(zhì)粉》課件
- 【可行性報(bào)告】2024年數(shù)據(jù)標(biāo)注與審核項(xiàng)目可行性研究分析報(bào)告
- 2024-2025學(xué)年滬科版數(shù)學(xué)七年級上冊期末綜合測試卷(一)(含答案)
- 2025門診護(hù)理工作計(jì)劃
- 《針法灸法》課件-溫灸器灸
- 電氣領(lǐng)域知識培訓(xùn)課件
- 山東省部分學(xué)校2024-2025學(xué)年高一上學(xué)期12月選科指導(dǎo)聯(lián)合測試地理試題( 含答案)
評論
0/150
提交評論