




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
UML與程序設(shè)計(C++)第4章
堆與拷貝結(jié)構(gòu)函數(shù)4.1關(guān)于堆C++程序內(nèi)存格局通常分為四個區(qū):全局數(shù)據(jù)區(qū)代碼區(qū)棧區(qū)堆區(qū)全局變量、靜態(tài)數(shù)據(jù)、常量存放在全局數(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ù)匹配標準來調(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)用默認結(jié)構(gòu)函數(shù),不能調(diào)用任何其它結(jié)構(gòu)函數(shù)。4.4拷貝結(jié)構(gòu)函數(shù)假如希望生成一個對象副本,能夠創(chuàng)建一個新對象,并將現(xiàn)有對象數(shù)據(jù)組員值賦值給新對象對應(yīng)組員。這種方法可行,但繁瑣。更加好路徑是使類含有某種復制本類對象能力,這便是拷貝結(jié)構(gòu)函數(shù)(CopyConstructor)功效。拷貝結(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)會自動生成一個默認拷貝結(jié)構(gòu)函數(shù),其工作方式是按組員初始化(memberwiseinitialization),即經(jīng)過依次拷貝每個非靜態(tài)數(shù)據(jù)組員實現(xiàn),假如組員是類對象,則調(diào)用其拷貝結(jié)構(gòu)函數(shù)或者默認拷貝結(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復制到暫時對象中。表示式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所引用目標不復存在。4.5深拷貝和淺拷貝
在默認拷貝結(jié)構(gòu)函數(shù)中,拷貝方式是逐一組員依次復制。但一個對象可能會擁有一些資源,當結(jié)構(gòu)函數(shù)為其分配了一個資源(比如堆內(nèi)存)時候,假如拷貝結(jié)構(gòu)函數(shù)簡單地制作了一個指向該資源副本,而不是重新分配,就會出現(xiàn)兩個對象擁有同一個資源,當對象析構(gòu)時,資源會被返還兩次。這種復制對象組員,但不復制資源方式稱為淺拷貝。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”)被認為是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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 樓房裝修承攬合同范本
- l建設(shè)工程合同范本
- 合作加工木材合同范本
- 北京租房合同范本封面
- 廠區(qū)快遞轉(zhuǎn)讓合同范本
- 倉庫雜物搬運勞務(wù)合同范本
- 合伙臨時合同范本
- 合同里寫定價合同范本
- 信息技術(shù)合同范本
- 廠家網(wǎng)店授權(quán)合同范例
- 《影視照明技術(shù)》課件:照亮影視作品的靈魂
- 5.1人民代表大會:我國的國家權(quán)力機關(guān) 課件高中政治統(tǒng)編版必修三政治與法治
- 2025年包頭輕工職業(yè)技術(shù)學院單招職業(yè)適應(yīng)性測試題庫及答案解析
- 2025中國中材海外科技發(fā)展有限公司校園招聘筆試參考題庫附帶答案詳解
- 2025-2030年即食麥片球行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報告
- 《酒店前廳設(shè)計》課件
- 廣東省廣州市天河區(qū)2024-2025學年八年級(上)期末物理試卷(含答案)
- - 《中國課件》揭示西安古都的千年歷史與文化
- 公司積分制管理實施方案
- 《Maya三維模型制作項目式教程(微課版)》全套教學課件
- 2024年湖南科技職業(yè)學院高職單招語文歷年參考題庫含答案解析
評論
0/150
提交評論