第4講拷貝構(gòu)造函數(shù)_第1頁
第4講拷貝構(gòu)造函數(shù)_第2頁
第4講拷貝構(gòu)造函數(shù)_第3頁
第4講拷貝構(gòu)造函數(shù)_第4頁
第4講拷貝構(gòu)造函數(shù)_第5頁
已閱讀5頁,還剩18頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Designed by Ruifang ZHAI 華中農(nóng)業(yè)大學(xué)計算機(jī)科學(xué)與技術(shù)系C+ C+ 程程 序序 設(shè)設(shè) 計計 C+ ProgrammingC+ Programming翟瑞芳翟瑞芳Designed by Ruifang ZHAI 華中農(nóng)業(yè)大學(xué)計算機(jī)科學(xué)與技術(shù)系一、拷貝構(gòu)造函數(shù)一、拷貝構(gòu)造函數(shù) 4.3.2 P109二、淺拷貝與深拷貝二、淺拷貝與深拷貝 6.5 P226Designed by Ruifang ZHAI 華中農(nóng)業(yè)大學(xué)計算機(jī)科學(xué)與技術(shù)系一、拷貝構(gòu)造函數(shù)一、拷貝構(gòu)造函數(shù) 拷貝構(gòu)造函數(shù):具有構(gòu)造函數(shù)的所有特性,形參是拷貝構(gòu)造函數(shù):具有構(gòu)造函數(shù)的所有特性,形參是本類對象的引用。本類對象的

2、引用。 使一個已經(jīng)存在的對象,去初始化一個新對象。使一個已經(jīng)存在的對象,去初始化一個新對象。創(chuàng)建新對象創(chuàng)建新對象A時,若用另一個對象時,若用另一個對象B來初始化,需使用來初始化,需使用復(fù)制復(fù)制(拷貝)構(gòu)(拷貝)構(gòu)造函數(shù)造函數(shù)將將B的值傳給的值傳給A。Rect rec1, rec2(2,4,6,2);Rect rec3=rec1, rec4(rec2);Designed by Ruifang ZHAI 華中農(nóng)業(yè)大學(xué)計算機(jī)科學(xué)與技術(shù)系 有關(guān)拷貝構(gòu)造函數(shù)有關(guān)拷貝構(gòu)造函數(shù)形參的討論形參的討論傳值型:傳值型:Rect(Rect r)指針型:指針型:Rect(const Rect *r)引用型:引用型:R

3、ect(const Rect &r)用實參用實參(已經(jīng)存在的對象已經(jīng)存在的對象)初始化形參初始化形參(新創(chuàng)建的對象新創(chuàng)建的對象),本身需要拷貝構(gòu)造函數(shù),形成邏輯上的循環(huán)定義。本身需要拷貝構(gòu)造函數(shù),形成邏輯上的循環(huán)定義。用對象的地址作實參,而非對象作實參。用對象的地址作實參,而非對象作實參。用對象作實參初始化引用型形參,但并不新創(chuàng)建對用對象作實參初始化引用型形參,但并不新創(chuàng)建對象。用象。用const限制可保護(hù)實參不被函數(shù)體修改。限制可保護(hù)實參不被函數(shù)體修改。拷貝構(gòu)造函數(shù)的形參為本類對象的引用拷貝構(gòu)造函數(shù)的形參為本類對象的引用Designed by Ruifang ZHAI 華中農(nóng)業(yè)大學(xué)計

4、算機(jī)科學(xué)與技術(shù)系 2若類中未定義拷貝構(gòu)造函數(shù),系統(tǒng)若類中未定義拷貝構(gòu)造函數(shù),系統(tǒng)會自動生成一個默認(rèn)拷貝構(gòu)造函數(shù):會自動生成一個默認(rèn)拷貝構(gòu)造函數(shù):類名類名(類名類名 &x) *this=x; 特性:特性: 1用拷貝構(gòu)造函數(shù)創(chuàng)建對象時,不會用拷貝構(gòu)造函數(shù)創(chuàng)建對象時,不會調(diào)用其他構(gòu)造函數(shù)。調(diào)用其他構(gòu)造函數(shù)。 3每個類有且僅有一個拷貝構(gòu)造函數(shù),每個類有且僅有一個拷貝構(gòu)造函數(shù),且不能重載。且不能重載。Designed by Ruifang ZHAI 華中農(nóng)業(yè)大學(xué)計算機(jī)科學(xué)與技術(shù)系 特性:特性: 4使用拷貝構(gòu)造函數(shù)創(chuàng)建對象常見的使用拷貝構(gòu)造函數(shù)創(chuàng)建對象常見的三種場合:三種場合:(1)創(chuàng)建新對象時創(chuàng)

5、建新對象時 (2)調(diào)用函數(shù)時調(diào)用函數(shù)時 (3)函數(shù)返回對象時函數(shù)返回對象時在函數(shù)設(shè)計中,使用在函數(shù)設(shè)計中,使用引用型形參引用型形參、引用引用返回類型返回類型,可避免拷貝構(gòu)造對象。,可避免拷貝構(gòu)造對象。Designed by Ruifang ZHAI 華中農(nóng)業(yè)大學(xué)計算機(jī)科學(xué)與技術(shù)系Class Pointpublic:Point (int xx=0, int yy=0) /constructor;x = xx;yy = yy;Point( Point &p); /copy constructor;int getX() return x; int getY() return y; priva

6、te:int x, y; ;Point:Point(Point &p)x = p.x;y = p.y; coutp.getX()endl; Designed by Ruifang ZHAI 華中農(nóng)業(yè)大學(xué)計算機(jī)科學(xué)與技術(shù)系(1) 創(chuàng)建創(chuàng)建新對象時,用一個已存在的對象初始化新對象新對象時,用一個已存在的對象初始化新對象 int main( ) Point a(1,2);Point b(a); /用對象用對象a初始化對象初始化對象bPoint c = a; /用對象用對象a初始化對象初始化對象ccoutb.getX()endl; return 0;Designed by Ruifang ZH

7、AI 華中農(nóng)業(yè)大學(xué)計算機(jī)科學(xué)與技術(shù)系(2) 調(diào)用調(diào)用函數(shù)時,用一個已存在的對象作實參初始化值函數(shù)時,用一個已存在的對象作實參初始化值傳遞的傳遞的形參形參void f(Point p) coutp.getX()endl;int main()Point a(1,2);f(a); /調(diào)用時拷貝構(gòu)造函數(shù)被調(diào)用;調(diào)用時拷貝構(gòu)造函數(shù)被調(diào)用;return 0;Designed by Ruifang ZHAI 華中農(nóng)業(yè)大學(xué)計算機(jī)科學(xué)與技術(shù)系(3) 函數(shù)函數(shù)返回對象時,用返回的表達(dá)式返回對象時,用返回的表達(dá)式(一個已經(jīng)存在的一個已經(jīng)存在的對象對象)初始化值返回時創(chuàng)建的臨時對象初始化值返回時創(chuàng)建的臨時對象 Poi

8、nt g( ) Point a(1,2);return a; /返回函數(shù)值返回函數(shù)值時時,拷貝構(gòu)造函數(shù)調(diào)用,拷貝構(gòu)造函數(shù)調(diào)用int main()Point b;b = g();return 0;Designed by Ruifang ZHAI 華中農(nóng)業(yè)大學(xué)計算機(jī)科學(xué)與技術(shù)系二、淺拷貝和深拷貝二、淺拷貝和深拷貝Designed by Ruifang ZHAI 華中農(nóng)業(yè)大學(xué)計算機(jī)科學(xué)與技術(shù)系class Rect public: Rect() / 構(gòu)造函數(shù),構(gòu)造函數(shù),p指向堆中分配的一空間指向堆中分配的一空間 p = new int(100); Rect() / 析構(gòu)函數(shù),釋放動態(tài)分配的空間析構(gòu)函數(shù)

9、,釋放動態(tài)分配的空間 coutDestructor!endl; if(p != NULL) delete p; private: int width, height; int *p; / 一指針成員一指針成員 ; int main() Rect rect1; Rect rect2(rect1); / 拷貝對象拷貝對象 return 0; Designed by Ruifang ZHAI 華中農(nóng)業(yè)大學(xué)計算機(jī)科學(xué)與技術(shù)系使用使用rect1拷貝拷貝rect2后后Designed by Ruifang ZHAI 華中農(nóng)業(yè)大學(xué)計算機(jī)科學(xué)與技術(shù)系 淺拷貝構(gòu)造淺拷貝構(gòu)造用對象用對象B作初始值創(chuàng)建新對象作初始

10、值創(chuàng)建新對象A時,若時,若B的數(shù)的數(shù)據(jù)成員僅是簡單的拷貝給據(jù)成員僅是簡單的拷貝給A,稱為淺拷貝構(gòu)造,稱為淺拷貝構(gòu)造系統(tǒng)生成的默認(rèn)拷貝構(gòu)造函數(shù)是淺拷貝構(gòu)造系統(tǒng)生成的默認(rèn)拷貝構(gòu)造函數(shù)是淺拷貝構(gòu)造Designed by Ruifang ZHAI 華中農(nóng)業(yè)大學(xué)計算機(jī)科學(xué)與技術(shù)系解決上例錯誤:解決上例錯誤: 讓對象擁有獨立的空間,讓對象擁有獨立的空間,在構(gòu)造對象時動態(tài)分在構(gòu)造對象時動態(tài)分配配,并定義析構(gòu)函數(shù)在對象生命期結(jié)束時釋放。,并定義析構(gòu)函數(shù)在對象生命期結(jié)束時釋放。當(dāng)被拷貝的當(dāng)被拷貝的對象對象數(shù)據(jù)成員是指針類型時數(shù)據(jù)成員是指針類型時,不不是拷貝該是拷貝該指針成員本身,而是將指針?biāo)笇ο笾羔槼蓡T本身,

11、而是將指針?biāo)笇ο筮M(jìn)行進(jìn)行拷貝??截???截悩?gòu)造拷貝構(gòu)造新對象時,需要為對象申請獨立的新對象時,需要為對象申請獨立的資源空間,稱為資源空間,稱為深拷貝構(gòu)造深拷貝構(gòu)造。Designed by Ruifang ZHAI 華中農(nóng)業(yè)大學(xué)計算機(jī)科學(xué)與技術(shù)系添加深拷貝構(gòu)造函數(shù)添加深拷貝構(gòu)造函數(shù)Rect:Rect(const Rect& r) width = r.width; height = r.height; / 為新對象重 新分配空間; p = new int; *p = *(r.p); Designed by Ruifang ZHAI 華中農(nóng)業(yè)大學(xué)計算機(jī)科學(xué)與技術(shù)系討論討論:Name類的設(shè)計類

12、的設(shè)計class Name private: char *name; public: Name(char *pn=NoName) name = pn; void UpperName() strupr(name); void Show() coutnameendl; ;Designed by Ruifang ZHAI 華中農(nóng)業(yè)大學(xué)計算機(jī)科學(xué)與技術(shù)系 int main() char st10=Tom, *pt=new char10; strcpy(pt,Jerry); Name n1(st),n2(pt),n3(Snoopy); n1.Show(); n2.Show(), n3.Show(); c

13、outDo something.endl; strcpy(st, Winnie); / 名字已被修改名字已被修改 n1.Show(); / 對象卻渾然不知對象卻渾然不知 delete pt; / 目標(biāo)已不存在目標(biāo)已不存在 n2.Show(); / 對象卻渾然不知對象卻渾然不知 n3.UpperName(); / 對象不能操作自己的屬性對象不能操作自己的屬性 n3.Show(); / 因為目標(biāo)為常量因為目標(biāo)為常量 return 0;測試程序,暴露問題測試程序,暴露問題 Designed by Ruifang ZHAI 華中農(nóng)業(yè)大學(xué)計算機(jī)科學(xué)與技術(shù)系 / 修改后的修改后的Name類類class N

14、ame private: char *name; public: Name(char *pn=“NoName”) / 修改后的構(gòu)造函數(shù)修改后的構(gòu)造函數(shù) name = new charstrlen(pn)+1; strcpy(name,pn); Name() / 析構(gòu)函數(shù)析構(gòu)函數(shù) coutDestructing nameendl; if(name!=NULL) delete name; void UpperName() strupr(name); void Show() cout nameendl; ;Designed by Ruifang ZHAI 華中農(nóng)業(yè)大學(xué)計算機(jī)科學(xué)與技術(shù)系int mai

15、n() char st10 = Tom, *pt = new char10; strcpy(pt, Jerry); Name n1(st),n2(pt),n3(Snoopy); Name n4 = n1; / 淺拷貝構(gòu)造淺拷貝構(gòu)造, 引出新問題引出新問題 cout Return to Operatiing System.endl; return 0;測試程序,解決老問題,暴露新問題測試程序,解決老問題,暴露新問題 Designed by Ruifang ZHAI 華中農(nóng)業(yè)大學(xué)計算機(jī)科學(xué)與技術(shù)系 深拷貝構(gòu)造深拷貝構(gòu)造Name(Name &pn) / 拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù) name = new charstrlen()+1;/ 構(gòu)造構(gòu)造(申請申請)屬于對象自己的資源空間屬于對象自己的資源空間 strcpy(name, pn.nam

溫馨提示

  • 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

提交評論