第9講 運(yùn)算符重載(二)_第1頁(yè)
第9講 運(yùn)算符重載(二)_第2頁(yè)
第9講 運(yùn)算符重載(二)_第3頁(yè)
第9講 運(yùn)算符重載(二)_第4頁(yè)
第9講 運(yùn)算符重載(二)_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

*運(yùn)算符重載為友元函數(shù)運(yùn)算符也可以重載為類的友元函數(shù),這樣它就可以自由地訪問(wèn)該類的任何數(shù)據(jù)成員。這時(shí),運(yùn)算所需要的操作數(shù)都需要通過(guò)函數(shù)的形參表來(lái)傳遞,在參數(shù)表中形參從左到右的順序就是運(yùn)算符操作數(shù)的順序。但是,有些運(yùn)算符不能重載為友元,如“=”、“()”、“[]”和“->”。運(yùn)算符重載為友元

1.雙目運(yùn)算:oprdlBoprd2

對(duì)于雙目運(yùn)算符B,如果oprdl為A類的對(duì)象,則應(yīng)當(dāng)把B重載為A類的友元函數(shù),該函數(shù)有兩個(gè)形參,其中一個(gè)形參的類型是A類。經(jīng)過(guò)重載之后,表達(dá)式oprdlBoprd2就相當(dāng)于函數(shù)調(diào)用operatorB(oprdl,oprd2)。

運(yùn)算符重載為友元函數(shù)名2.單目運(yùn)算

1)前置單目運(yùn)算:Uoprd

對(duì)于前置單目運(yùn)算符U,如“-”(負(fù)號(hào))等,如果要實(shí)現(xiàn)表達(dá)式Uoprd(其中oprd為A類的對(duì)象),則U可以重載為A類的友元函數(shù),函數(shù)的形參為A類的對(duì)象。經(jīng)過(guò)重載之后,表達(dá)式Uoprd相當(dāng)于函數(shù)調(diào)用operatorU(oprd)。運(yùn)算符重載為友元2)后置單目運(yùn)算:oprdV

對(duì)于后置運(yùn)算符V,如“++”和“--”,如果要實(shí)現(xiàn)表達(dá)式oprd++或oprd--(其中oprd為A類的對(duì)象),那么運(yùn)算符就可以重載為A類的友元函數(shù),這時(shí)函數(shù)的形參有兩個(gè),一個(gè)是A類的對(duì)象oprd,另一個(gè)是整型(int)形參。重載之后,表達(dá)式oprd++和oprd--就相當(dāng)于函數(shù)調(diào)用operator++(oprd,0)和operator--(oprd,0)。運(yùn)算符重載為友元【例3】雙目運(yùn)算符重載為友元重載例題。#include<iostream.h>classpoint{private: floatx,y;運(yùn)算符重載為友元運(yùn)算符重載為友元public:point(floatxx=0,floatyy=0){x=xx;y=yy;}floatget_x(){returnx;}floatget_y(){returny;}

friendpointoperator+(pointp1,pointp2);//重載運(yùn)算符“+”friendpointoperator-(pointp1,pointp2);//和“-”為友元函數(shù)};

pointoperator+(pointp1,pointp2){returnpoint(p1.x+p2.x,p1.y+p2.y);}pointoperator-(pointp1,pointp2){ returnpoint(p1.x-p2.x,p1.y-p2.y);}運(yùn)算符重載為友元voidmain(){pointp1(3,3),p2(2,2),p3,p4;p3=p1+p2;//兩點(diǎn)相加p4=p1-p2;//兩點(diǎn)相減cout<<p3.get_x()<<""<<p3.get_y()<<endl;cout<<p4.get_x()<<""<<p4.get_y()<<endl;}運(yùn)算符重載為友元練習(xí)、定義一個(gè)復(fù)數(shù)類complex,重載運(yùn)算符“+”,使之能用于復(fù)數(shù)的加法運(yùn)算,參加運(yùn)算的兩個(gè)運(yùn)算量可以都是復(fù)數(shù)類對(duì)象,也可以其中有一個(gè)是整數(shù),順序任意。例如:c1+c2,c1+i,i+c1,c1+=c2均合法,編程:分別求兩個(gè)復(fù)數(shù)之和,整數(shù)和復(fù)數(shù)之和。運(yùn)算符重載賦值運(yùn)算符“=”的重載對(duì)任一類X,如果沒(méi)有用戶自定義的賦值運(yùn)算符函數(shù),那么系統(tǒng)自動(dòng)地為其生成一個(gè)缺省的賦值運(yùn)算符函數(shù),定義為類X中的成員到成員的賦值,例如:

X&X::operator=(constX&source){//…成員間賦值

}

若obj1和obj2是類X的兩個(gè)對(duì)象,obj2已被創(chuàng)建,則編譯程序遇到如下語(yǔ)句:

obj1=obj2;

就調(diào)用缺省的賦值運(yùn)算符函數(shù),將對(duì)象obj2的數(shù)據(jù)成員的值逐個(gè)賦給對(duì)象obj1的對(duì)應(yīng)數(shù)據(jù)成員中。

賦值運(yùn)算符“=”的重載1.指針懸掛問(wèn)題在某些特殊情況下,如類中有指針類型時(shí),使用缺省的賦值運(yùn)算符函數(shù)會(huì)產(chǎn)生錯(cuò)誤。例使用缺省的賦值運(yùn)算符函數(shù)產(chǎn)生錯(cuò)誤的例子。

#include<iostream.h>#include<string.h>classstring{

賦值運(yùn)算符“=”的重載public:string(char*s){ptr=newchar[strlen(s)+1];strcpy(ptr,s);}~string(){deleteptr;}voidprint(){cout<<ptr<<endl;}

賦值運(yùn)算符“=”的重載private:char*ptr;};voidmain(){stringp1(“book”),p2("pen");p1=p2;cout<<"p2:";p2.print();cout<<"p1:";p1.print();}

賦值運(yùn)算符“=”的重載2.重載賦值運(yùn)算符解決指針懸掛問(wèn)題為了解決上述使用缺省的賦值運(yùn)算符所遇到的指針懸掛問(wèn)題,必須重載賦值運(yùn)算符,使得對(duì)目標(biāo)對(duì)象數(shù)據(jù)成員指針的賦值,是把原對(duì)象指針ptr所指向的內(nèi)容傳遞給它,而不是簡(jiǎn)單地傳遞指針值。

賦值運(yùn)算符“=”的重載例:重載賦值運(yùn)算符解決指針懸掛問(wèn)題。

#include<iostream.h>#include<string.h>classstring{private:char*ptr;

賦值運(yùn)算符“=”的重載public:string(char*s){ptr=newchar[strlen(s)+1];strcpy(ptr,s);}~string(){deleteptr;}voidprint(){cout<<ptr<<endl;}};

賦值運(yùn)算符“=”的重載

string&operator=(conststring&s){if(this==&s)return*this;//防止s=s的賦值

deleteptr;//釋放掉原區(qū)域

ptr=newchar[strlen(s.ptr)+1];//分配新區(qū)域

strcpy(ptr,s.ptr);//字符串拷貝

return*this;}

賦值運(yùn)算符“=”的重載voidmain(){stringp1("book");stringp2("pen");p1=p2;cout<<"p2:";p2.print();cout<<"p1:";p1.print();}

賦值運(yùn)算符“=”的重載

*其它運(yùn)算符重載①比較運(yùn)算符重載(如<,>,<=,>=,==,!=)。②賦值運(yùn)算符重載(如=,+=,-=,*=,/=)。③下標(biāo)運(yùn)算符“[]”重載。下標(biāo)運(yùn)算符“[]”通常用于取數(shù)組中的某個(gè)元素,通過(guò)下標(biāo)運(yùn)算符重載,可以實(shí)現(xiàn)數(shù)組下標(biāo)的越界檢測(cè)等。

運(yùn)算符重載④運(yùn)算符new和delete重載。通過(guò)重載new和delete,可以克服new和delete的不足,使其按要求完成對(duì)內(nèi)存的管理。⑤逗號(hào)運(yùn)算符“,”重載。逗號(hào)運(yùn)算符構(gòu)成的表達(dá)式為“左操作數(shù),右操作數(shù)”,該表達(dá)式返回右操作數(shù)的值。運(yùn)算符重載*流運(yùn)算符<<和>>的重載C++的流插入運(yùn)算符“<<”和流提取運(yùn)算符”>>”是C++在類庫(kù)中提供的,所有C++編譯系統(tǒng)都在類庫(kù)中提供輸入流類istream和輸出流類ostream。cin和cout分別是istream類和ostream類的對(duì)象。在類庫(kù)提供的頭文件中已經(jīng)對(duì)“<<”和“>>”進(jìn)行了重載,使之作為流插入運(yùn)算符和流提取運(yùn)算符,能用來(lái)輸入和輸出C++標(biāo)準(zhǔn)類型的數(shù)據(jù)。因此,凡是用到“cin>>”和“cout<<”的地方都要用

#include<iostream.h>將頭文件包含到本程序文件中。流運(yùn)算符的重載用戶自定義的類型的數(shù)據(jù)(如:程序中需要輸入和輸出復(fù)數(shù)類的對(duì)象),是不能直接用“<<”和“>>”來(lái)輸入和輸出的,如果想用它們來(lái)輸入和輸出自己聲明的類型的數(shù)據(jù),就必須要對(duì)它們進(jìn)行重載。

思考:對(duì)插入“<<”和提取”>>”運(yùn)算符的重載定義成一個(gè)類的成員函數(shù)還是類的友元函數(shù)。流運(yùn)算符的重載因?yàn)檫@兩個(gè)操作符的左邊是流而不是被操作的對(duì)象,因此對(duì)它們只能夠重載為友元函數(shù)。*插入運(yùn)算符重載的一般形式:

ostream&operator<<(ostream&函數(shù)的流,類名&對(duì)象名){……//函數(shù)代碼

return函數(shù)的流;}流運(yùn)算符的重載*提取運(yùn)算符重載的一般形式:istream&operator>>(istream&函數(shù)的流,類名&對(duì)象名){……//函數(shù)代碼return函數(shù)的流;}流運(yùn)算符的重載例:對(duì)用戶自定義類型(復(fù)數(shù)類complex)的對(duì)象進(jìn)行輸入和輸出。#include<iostream.h>classcomplex{doublereal;doubleimag;

流運(yùn)算符的重載public:friendostream&operator<<(ostream&out,complex&a);friendistream&operator>>(istream&in,complex&b);};流運(yùn)算符的重載istream&operator>>(istream&in,complex&b){cout<<"inputrealpartandimagpartofcomplexnumber:";in>>b.real>>b.imag;returnin;}流運(yùn)算符的重載ostream&operator<<(ostream&out,complex&a){out<<"("<<a.real<<","<<a.imag<<"i)";returnout;}流運(yùn)算符的重載intmain(){complexc1,c2;cin>>c1>>c2;cout<<"c1="<<c1<<endl;cout<<"c2="<<c2<<endl;return0;}流運(yùn)算符的重載運(yùn)行結(jié)果:inputrealpartandimagpartofcomplexnumber:36

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論