




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
UML與程序設(shè)計(C++)第4章
堆與拷貝結(jié)構(gòu)函數(shù)4.1關(guān)于堆C++程序內(nèi)存格局通常分為四個區(qū):全局?jǐn)?shù)據(jù)區(qū)代碼區(qū)棧區(qū)堆區(qū)全局變量、靜態(tài)數(shù)據(jù)、常量存放在全局?jǐn)?shù)據(jù)區(qū);全部類組員函數(shù)和非組員函數(shù)代碼存放在代碼區(qū);為運行函數(shù)而分配局部變量、函數(shù)參數(shù)、返回數(shù)據(jù)、返回地址等存放于棧區(qū);余下空間作為堆區(qū)。4.2需要new和delete原因從C++立場來看,不使用malloc()函數(shù)原因是它在分配空間時候不能調(diào)用結(jié)構(gòu)函數(shù)。類對象建立包含分配空間、結(jié)構(gòu)結(jié)構(gòu)以及初始化,這些是由結(jié)構(gòu)函數(shù)統(tǒng)一完成。voidfn(){ Tdate*pD; pD=(Tdate*)malloc(sizeof(TDate)); //… free(pD);}classTDate{public:TDate();//結(jié)構(gòu)函數(shù)voidSetDate(inty,intm,intd);intIsLeapYear();voidPrint();private:intyear,month,day;};4.2需要new和delete原因假如結(jié)構(gòu)函數(shù)被調(diào)用,則須在進行內(nèi)存分配malloc()調(diào)用時進行,而malloc()僅是一個函數(shù)調(diào)用,沒有足夠信息調(diào)用結(jié)構(gòu)函數(shù)。pD從malloc()取得只是一個含有隨機數(shù)據(jù)類對象空間,須在內(nèi)存分配之后再進行初始化。voidfn(){ Tdate*pD; pD=(Tdate*)malloc(sizeof(TDate)); pD->SetDate(,1,1); //… free(pD);}4.3分配堆對象C++new和delete機制更簡單易懂。voidfn(){ Tdate*pS; pS=newTDate;
//分配堆空間并結(jié)構(gòu) //… deletepS;//析構(gòu)并將空間返還給堆}假如分配局部對象,則在該局部對象退出作用域時自動調(diào)用析構(gòu)函數(shù)。但堆對象作用域是整個程序生命期,所以除非程序運行完成,不然堆對象作用域不會到期。堆對象析構(gòu)是在釋放堆對象語句delete執(zhí)行之時。4.3分配堆對象假如結(jié)構(gòu)函數(shù)有參數(shù),則new后面類類型也需要對應(yīng)參數(shù)。classTDate{public:TDate(inty,intm,intd){ year=y; month=m; day=d;private:intyear,month,day;};voidfn(){ Tdate*pD; pD=newTdate(,1,1);
//… deletepD;}new依據(jù)參數(shù)匹配標(biāo)準(zhǔn)來調(diào)用結(jié)構(gòu)函數(shù),假如寫成pD=newTdate;則因為TDate類沒有提供無參結(jié)構(gòu)函數(shù)而犯錯。4.3分配堆對象從堆中還能夠分配對象數(shù)組classStudent{public:Student(char*pName=“noname”){ strncpy(name,pName,sizeof(name)); name[sizeof(name)-1]=‘\0’;}private:charname[40];};voidfn(intnum){ Student*pS=newStudent[num]; //… delete[]pS;}結(jié)構(gòu)函數(shù)被調(diào)用num次,依次結(jié)構(gòu)pS[0]到pS[num-1]。從堆上分配對象數(shù)組,只能調(diào)用默認(rèn)結(jié)構(gòu)函數(shù),不能調(diào)用任何其它結(jié)構(gòu)函數(shù)。4.4拷貝結(jié)構(gòu)函數(shù)假如希望生成一個對象副本,能夠創(chuàng)建一個新對象,并將現(xiàn)有對象數(shù)據(jù)組員值賦值給新對象對應(yīng)組員。這種方法可行,但繁瑣。更加好路徑是使類含有某種復(fù)制本類對象能力,這便是拷貝結(jié)構(gòu)函數(shù)(CopyConstructor)功效??截惤Y(jié)構(gòu)函數(shù)是一個特殊結(jié)構(gòu)函數(shù),含有普通結(jié)構(gòu)函數(shù)特點,其作用是用一個已經(jīng)存在對象去初始化一個新同類對象。4.4拷貝結(jié)構(gòu)函數(shù)能夠依據(jù)實際問題需要定義拷貝結(jié)構(gòu)函數(shù),以實現(xiàn)同類對象之間數(shù)據(jù)組員傳遞。假如沒有自定義類拷貝結(jié)構(gòu)函數(shù),系統(tǒng)會自動生成一個默認(rèn)拷貝結(jié)構(gòu)函數(shù),其工作方式是按組員初始化(memberwiseinitialization),即經(jīng)過依次拷貝每個非靜態(tài)數(shù)據(jù)組員實現(xiàn),假如組員是類對象,則調(diào)用其拷貝結(jié)構(gòu)函數(shù)或者默認(rèn)拷貝結(jié)構(gòu)函數(shù)??截惤Y(jié)構(gòu)函數(shù)形式:類名(類名&對象名)形參是本類對象引用4.4拷貝結(jié)構(gòu)函數(shù)classTPoint{public: TPoint(intx=0,inty=0){X=x;Y=y;} TPoint(TPoint&p);//拷貝結(jié)構(gòu)函數(shù)
intGetX(){returnX;} intGetY(){returnY;}private: intX,Y;};TPoint::TPoint(TPoint&p){ X=p.X; Y=p.Y; cout<<“拷貝結(jié)構(gòu)函數(shù)被調(diào)用”<<endl;}4.4拷貝結(jié)構(gòu)函數(shù)
普通結(jié)構(gòu)函數(shù)在對象創(chuàng)建時被調(diào)用,拷貝結(jié)構(gòu)函數(shù)在以下三種情況下會被調(diào)用:1.用類一個對象去初始化該類另外一個對象,比如:voidmain(){TPointA(1,2);TPointB(A);//用對象A初始化對象B,拷貝結(jié)構(gòu)函數(shù)被調(diào)用
//…}2.函數(shù)形參是類對象,調(diào)用函數(shù)進行形參和實參結(jié)合時,比如voidf(TPointp)//形參p用實參值進行結(jié)構(gòu){cout<<p.GetX()<<endl;}4.4拷貝結(jié)構(gòu)函數(shù)3.函數(shù)返回值是類對象,函數(shù)執(zhí)行完成返回調(diào)用者時,拷貝結(jié)構(gòu)函數(shù)會被調(diào)用。TPointg(){TPointA(1,2);returnA;}voidmain(){TPointB;B=g();}說明:函數(shù)g表面上將對象A返回給主函數(shù),但A是局部對象,離開建立它函數(shù)后就消亡了,不可能在返回主函數(shù)后繼續(xù)生存,編譯系統(tǒng)在處理這種情況時會在主函數(shù)中創(chuàng)建一個暫時無名對象,該暫時對象生存期只在函數(shù)調(diào)用所處表示式中。執(zhí)行“returnA;”時,實際上是調(diào)用拷貝結(jié)構(gòu)函數(shù)將對象A復(fù)制到暫時對象中。表示式B=g();計算完成后,暫時對象自動消失。4.4拷貝結(jié)構(gòu)函數(shù)
普通要求,創(chuàng)建暫時對象,只在創(chuàng)建它們外部表示式中有效。Studentfn(){ Studentms(“Randy”); returnms;}voidmain(){ Student&ref=fn(); //….}
因為外部表示式Student&ref=fn();到分號處結(jié)束,之后從fn()返回暫時對象不再有效,即ref所引用目標(biāo)不復(fù)存在。4.5深拷貝和淺拷貝
在默認(rèn)拷貝結(jié)構(gòu)函數(shù)中,拷貝方式是逐一組員依次復(fù)制。但一個對象可能會擁有一些資源,當(dāng)結(jié)構(gòu)函數(shù)為其分配了一個資源(比如堆內(nèi)存)時候,假如拷貝結(jié)構(gòu)函數(shù)簡單地制作了一個指向該資源副本,而不是重新分配,就會出現(xiàn)兩個對象擁有同一個資源,當(dāng)對象析構(gòu)時,資源會被返還兩次。這種復(fù)制對象組員,但不復(fù)制資源方式稱為淺拷貝。4.5深拷貝和淺拷貝假如創(chuàng)建一個對象時,分配了資源就需要定義自己拷貝結(jié)構(gòu)函數(shù)來改變?nèi)笔≈鸾M員拷貝方式,不但拷貝組員,也拷貝資源,這種方式稱為深拷貝。通常,假如類需要析構(gòu)函數(shù)來釋放資源話,那么它也需要一個拷貝結(jié)構(gòu)函數(shù)。4.6無名對象
能夠直接調(diào)用結(jié)構(gòu)函數(shù)產(chǎn)生無名對象。voidfn(){ Student(“Randy”); //….}
無名對象能夠作為實參傳遞給函數(shù),能夠用來拷貝結(jié)構(gòu)一個新對象,也能夠初始化一個引用。voidfn(Student&s);voidmain(){ Student&refs=Student(“Randy”); Students=Student(“Randy”); fn(Student(“Randy”));}4.7結(jié)構(gòu)函數(shù)用于類型轉(zhuǎn)換
轉(zhuǎn)換用戶自定義類類型需要定義含有一個參數(shù)結(jié)構(gòu)函數(shù)。classStudent(){ public: Student(char*); //….};
因為有Student(char*)結(jié)構(gòu)函數(shù),又有函數(shù)fn(Student&s),于是fn(“Jenny”)被認(rèn)為是fn(Student(“Jenny”)),給予匹配。voidfn(Student&s);voidmain(){ fn(“Jenny”);}4.7結(jié)構(gòu)函數(shù)用于類型轉(zhuǎn)換
結(jié)構(gòu)函數(shù)用于類型轉(zhuǎn)換時要注意以下兩點:只會嘗試含有一個參數(shù)結(jié)構(gòu)函數(shù)假如存在二義性,則放棄嘗試classStudent(){public:Student(char*pName=“noname”);//….};classTeacher(){pub
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030轉(zhuǎn)向臂起重機行業(yè)產(chǎn)業(yè)運行態(tài)勢及投資規(guī)劃深度研究報告
- 2025至2030中國自穿孔鉚釘行業(yè)市場占有率及投資前景評估規(guī)劃報告
- 2025至2030中國自助秤行業(yè)發(fā)展趨勢分析與未來投資戰(zhàn)略咨詢研究報告
- 2025至2030中國自動視覺檢測系統(tǒng)行業(yè)市場占有率及投資前景評估規(guī)劃報告
- 2025至2030中國腕帶高爾夫GPS行業(yè)產(chǎn)業(yè)運行態(tài)勢及投資規(guī)劃深度研究報告
- 2025至2030中國腳輪上的患者升降平臺行業(yè)產(chǎn)業(yè)運行態(tài)勢及投資規(guī)劃深度研究報告
- 2025至2030中國胃腸病學(xué)設(shè)備行業(yè)市場深度研究及發(fā)展前景投資可行性分析報告
- 2025至2030中國腸內(nèi)飼管行業(yè)產(chǎn)業(yè)運行態(tài)勢及投資規(guī)劃深度研究報告
- 2025至2030中國聚苯醚(PPE)混合物和合金行業(yè)產(chǎn)業(yè)運行態(tài)勢及投資規(guī)劃深度研究報告
- 2025至2030中國聚丙烯蜂窩行業(yè)產(chǎn)業(yè)運行態(tài)勢及投資規(guī)劃深度研究報告
- 抖音技巧培訓(xùn)課件
- 職業(yè)規(guī)劃樂高老師課件
- 融資合作協(xié)議模板(2篇)
- 數(shù)字時代的商務(wù)英語寫作知到章節(jié)答案智慧樹2023年對外經(jīng)濟貿(mào)易大學(xué)
- 檢驗科溝通技巧及其它
- 2022年安徽大學(xué)科研助理(校聘)招聘60人筆試備考題庫及答案解析
- 四年級閱讀訓(xùn)練概括文章主要內(nèi)容(完美)
- YY/T 0995-2015人類輔助生殖技術(shù)用醫(yī)療器械術(shù)語和定義
- GB/T 19352.1-2003熱噴涂熱噴涂結(jié)構(gòu)的質(zhì)量要求第1部分:選擇和使用指南
- 智護訓(xùn)練講解學(xué)習(xí)課件
- 母乳喂養(yǎng)自我效能量表(BSES) (1)附有答案
評論
0/150
提交評論