作業(yè)━━第5章(4)━━運(yùn)算符重載._第1頁(yè)
作業(yè)━━第5章(4)━━運(yùn)算符重載._第2頁(yè)
作業(yè)━━第5章(4)━━運(yùn)算符重載._第3頁(yè)
作業(yè)━━第5章(4)━━運(yùn)算符重載._第4頁(yè)
作業(yè)━━第5章(4)━━運(yùn)算符重載._第5頁(yè)
已閱讀5頁(yè),還剩18頁(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)介

1、運(yùn)算符重載【學(xué)習(xí)要點(diǎn)】1.理解多態(tài)性的概念和實(shí)現(xiàn)。 編譯時(shí)多態(tài)性是通過(guò)函數(shù)重載、運(yùn)算符重載實(shí)現(xiàn)的。 運(yùn)行時(shí)多態(tài)性是通過(guò)類的繼承 +虛函數(shù)實(shí)現(xiàn)的。2 .掌握運(yùn)算符重載的作用和規(guī)則。 在C+中可根據(jù)需要對(duì)運(yùn)算符賦予多種含義,以配合用戶自定義的類類型。運(yùn)算符重載是通過(guò)定義運(yùn)算符重載函數(shù)operator運(yùn)算符(實(shí)現(xiàn)的。3 .掌握雙目、單目運(yùn)算符重載為成員函數(shù)的方法。4 .掌握雙目、單目運(yùn)算符重載為友元函數(shù)的方法。5 .掌握重載為成員函數(shù)、重載為友元函數(shù)的區(qū)別:友元函數(shù)與成員函數(shù)不同,它不是類的成員,沒(méi)有this指針。 運(yùn)算符=、()、卜一 不能重載為友元函數(shù),只能重載為成員函數(shù)。 運(yùn)算符插入” 、提取

2、” 只能重載為友元函數(shù)。6 .掌握幾個(gè)特殊運(yùn)算符“+” “”、“ =”“”“<<”“>>的重載。7 .掌握類型轉(zhuǎn)換函數(shù)。8掌握自定義字符串類。9 .掌握C+標(biāo)準(zhǔn)庫(kù)中的string類的使用?!纠}分析】1 .下面程序中的錯(cuò)誤有幾處 ?#in eludeclass C int x , y ;public:C ( int a , int b : x( a , y( b C op erator ( C a C temp ; tem p. x=x+a.x ; temp.y=y+a.y ; return temp ; int op erator# ( C a return ( x

3、* y ; friend C op erator= ( C a x=a.x ; y=b.y ; return *this ; void show( cout << "x=" << x <<"ty=" << y << endl ; ;void main( C a( 2,3 , b( 2,3 , c ;(a+b.show( ; c=a ; c.show(;【答案】3【解析】函數(shù) C operator (C a ;須是C+系統(tǒng)預(yù)定義的,而運(yùn)算符重載是允許用戶重新定義運(yùn)算符的含義,但此運(yùn)算符必 ”不是C

4、+預(yù)定義的運(yùn)算符,應(yīng)換成 + ”。函數(shù) intoperator# (C a ;符號(hào)#不允許重載,應(yīng)換成 *”,另外形參C a也不需要。函數(shù)friend C operator = (C a ;賦值運(yùn)算符函數(shù),故將friend刪去。其次,返回類型最好是=”只能重載為成員函數(shù),不能重載為友元2 .編寫程序:存放在 my Vector .cpp文件中,包含內(nèi)容如下:向量在三條坐標(biāo)軸上投影值的X、 y、z。定義向量類Vector。私有成員數(shù)據(jù)有:存放公有成員函數(shù)有:可設(shè)置 向量中x、y、z值的成員函數(shù)void set( float a=0, float b=0, float c=0 ;可輸出向量中X、y

5、、z值的成員函數(shù) void show(;構(gòu)造函數(shù) Vector ( float a=0 , float b=0 , float c=0 ;構(gòu)造函數(shù)Vector ( float v 3 ;兩個(gè)賦值運(yùn)算符 ="重載成員函數(shù) Vector & operator=( Vector v 、Vector & operator=( float v 3 。將實(shí)現(xiàn)兩個(gè)向量之間加、減、乘運(yùn)算 的三個(gè)獨(dú)立函數(shù)聲明為 Vector類的友元函數(shù):friend Vector op erator+( Vector v1 , Vector v2friend Vector op erator-( Ve

6、ctor v1 , Vector v2friend float op erator*( Vector v1 , Vector v2 編寫main(函數(shù)去測(cè)試,完成向量間的運(yùn)算?!咎崾尽咳粝蛄縜在三條坐標(biāo)軸上的投影為 ax , ay , az,則表達(dá)式a = ax , ay , az 稱 為向量a的坐標(biāo)表達(dá)式。設(shè)有兩個(gè)向量 a和b,它們之間的加、減、乘的運(yùn)算公式為:a + b = ax +bx , ay +by , az+bz a - b = ax -bx , ay -by , az-bz a * b = ax *bx + ay *by + az *bz將運(yùn)算符+ ”、-”、* ”和=”重載,實(shí)

7、現(xiàn)向量間的加、減、乘、賦值運(yùn)算。【答案】編寫程序如下#in clude #in clude class Vector float x , y ,乙public:Vector( float a=0 , float b=0 , float c=0 x=a ; y=b ; z=c ; Vector( float v 3 x=v0 ; y=v1 ; z=v2 ; void set( float a=0 , float b=0 , float c=0 x=a ; y=b ; z=c ; void show( cout << x << 'i'cout <<

8、; ( (y<0 ? '-' : '+' << fabs(y << j'cout << ( (z<0 ? '-' : '+' << fabs(z << 'k' << endl ; Vector & op erator=( Vector v ;Vector & op erator=( float v 3 ;friendVector op erator+( Vector v1 , Vector v2 ;frien

9、dVector op erator-( Vector v1 , Vector v2 ;friendfloat op erator*( Vector v1 , Vector v2 ;;Vector & Vector: operator=( Vector v x=v.x ; y=v.y ; z=v.z ; return *this ; Vector & Vector: operator=( float v 3 x=v0 ; y=v1 ; z=v2 ; return *this ; Vector op erator+( Vector v1 , Vector v2 Vector tem

10、p ;temp. x=v1.x+v2.x ; temp.y=v1.y+v2.y ; temp. z=v1.z+v2.z ;return temp ; Vector op erator-( Vector v1 , Vector v2 Vector temp ;temp. x=v1.x-v2.x ; temp.y=v1.y-v2.y ; temp. z=v1.z-v2.z ;return temp ; float op erator*( Vector v1 , Vector v2 return ( v1.x*v2.x + v1.y*v2.y + v1.z*v2.z ; void main( flo

11、at a = 1 , 2,3 ;Vector v1( a , v2( 4,5,6 , v3( 7,8,9 , v4 , v5 ;v4 = v1 + v2 ; v4.show(;v5 = v3 - v1 ; v5.show(;cout << "v1*v2=" << v1*v2 << endl ;【解析】定義向量類,并對(duì)各運(yùn)算符進(jìn)行重載。本程序采用友元函數(shù)重載“ +”算符,在此也可采用成員函數(shù)重載,從程序可讀性考慮,一般認(rèn)為雙目運(yùn)算符,重載為友 元函數(shù)更好些。但重載 “進(jìn)算符必須用成員函數(shù)。【思考題】選擇題1 下面運(yùn)算符中,不能重載的是A.

12、?:B. +spanC . *D. <=.、*、 sizeof【答案】?【提示】C+中不能被重載的運(yùn)算符有:“ ”、?: ”、2 .下面運(yùn)算符中,不能重載的 是A. &&B. C.:D. new【答案】?3 .關(guān)于運(yùn)算符重載,下面描述中正確的是運(yùn)算符重載可以改變操作數(shù)的個(gè)數(shù)運(yùn)算符重載可以改變優(yōu)先級(jí)C.運(yùn)算符重載可以改變結(jié)合性運(yùn)算符重載不可以改變語(yǔ)法結(jié)構(gòu)【答案】?【提示】運(yùn)算符重載不能改變操作數(shù)的個(gè)數(shù)、運(yùn)算符的優(yōu)先級(jí)、運(yùn)算符的結(jié)合性和運(yùn)算的 語(yǔ)法結(jié)構(gòu)。4.友元重載運(yùn)算符obl>ob2被C+編譯器解釋為A.op erator>( obl , ob2B.>(o

13、b1 , ob2C.ob2. op erator>( ob1D.ob1. op erator>( ob2【答案】?【提示】友元函數(shù)重載運(yùn)算符的調(diào)用形式:operatorv運(yùn)算符 >( < 參數(shù)1> , <參數(shù)2>等價(jià)于表達(dá)式: < 參數(shù)1> <運(yùn)算符 > < 參數(shù)2>5.若a+b運(yùn)算需通過(guò)成員函數(shù)實(shí)現(xiàn)“ +運(yùn)算符重載,下面描述中正確的是A. a必須為該類對(duì)象,b可為其它數(shù)據(jù)類型B. a和b都必須為該類對(duì)象C. b必須為該類對(duì)象,a可為其它數(shù)據(jù)類型D . a和b均可為其它數(shù)據(jù)類型【答案】?【提示】成員函數(shù)實(shí)現(xiàn)a+b時(shí),

14、編譯器解釋為:a.operator(b ,因此左操作數(shù)a必須為該 類對(duì)象,否則無(wú)法實(shí)現(xiàn)成員函數(shù)的調(diào)用,而右操作數(shù)可以是該類的對(duì)象,也可以是其它數(shù) 據(jù)類型。6 . MA是一個(gè)類名,下面重載運(yùn)算符的成員函數(shù)原型 中不正確的是MA op erator-(;MA op erator-( MA ;MA op erator-( MA & ;MA op erator-( MA , MA ;【答案】【提示】運(yùn)算符“”可以是單目運(yùn)算符的 負(fù)”運(yùn)算,也可以是雙目運(yùn)算符的 減”運(yùn)算,因 此成員函數(shù)實(shí)現(xiàn)時(shí),可以不帶參數(shù) (實(shí)現(xiàn)一元運(yùn)算,也可以帶一個(gè)參數(shù) (實(shí)現(xiàn)二元運(yùn)算,但 不可能是兩個(gè)參數(shù)。7 .有下面類定義

15、,并在類外對(duì)“ +運(yùn)算符重載函數(shù)進(jìn)行定義,其中 不正確的是class Point int x , y ;p ublic:Point op erator+(;;Point Poin t: op erator+( x+ ; y+ ; retur n *this ; B.Point Poin t: op erator+( x+=5 ; y+=5 ; retur n *this ; C.Point Poin t: op erator+( x- ; y- ; retur n *this ; D.Point Poin t: op erator+( int n x+=n ; y+=n ; retur n *

16、this ; 【答案】? ?函數(shù)定義時(shí)的參數(shù)聲明必須與函數(shù)原型中的參數(shù)聲明一致。答案D與函數(shù)原型B和答案C中,函數(shù)的功能和實(shí)際理解的【提示】中的參數(shù)不一致,所以是錯(cuò)誤的。盡管在答案自增概念不一樣,但函數(shù)定義是正確的,運(yùn)算符重載本身就是給運(yùn)算符重新定義功能。8對(duì)list類進(jìn)行邏輯運(yùn)算符 “=重載,下面重載函數(shù)聲明中正確的是A.list & list: op erator=( const list &a ;B.list list: op erator=( const list &a ;C.bool & list: op erator=( const list &am

17、p;a ;D.bool list: op erator=( const list &a ;【答案】?9.有下面類定義,若主函數(shù)中有定義:fun m , c , d ;則執(zhí)行語(yǔ)句c=+m;編譯器將其中的+m解釋為class fun public: fun operator+=( fun ;friend fun op erator+( fun & ;A.c.op erator+( m ;B.m=op erator+( m ;0m.op erator+( m ;op erator+( m ;【答案】?10 .在上題中,若執(zhí)行語(yǔ)句 d+=m;編譯器將其解釋為A.d=op erator+

18、=( m ;B.m=op erator+=( d ;C.d.op erator+=( m ;D.m.op erator+=( d ;【答案】? ?11.有下面類定義,若類外執(zhí)行語(yǔ)句a=b+c;編譯器將其中的b+c解釋為:op erator +( b,c ;則下面描述中正確的是class Comfriend Com op erator+( ;A. a、b、c都必須是Com的對(duì)象。B. a、b都必須是Com的對(duì)象。C . a必須是Com的對(duì)象,而b和c中只要有一個(gè)是 Com的對(duì)象即可。D. b、c都必須是Com的對(duì)象。【答案】?填空題,而右操作數(shù)可以是1 .雙目運(yùn)算符重載為類的成員函數(shù)時(shí),其左操作

19、數(shù)必須是【提示】將雙目運(yùn)算符重載為類的成員函數(shù)時(shí),由于this指針在非靜態(tài)成員函數(shù)操作對(duì)象時(shí)都作為第一個(gè)隱式參數(shù)傳遞了對(duì)象,它充當(dāng)了雙目運(yùn)算符的左操作數(shù),而該成員函數(shù) 的形參則表示雙目運(yùn)算符的右操作數(shù)。因此左操作數(shù)必須是該類的對(duì)象,而右操作數(shù)可以 是類型與形參類型兼容的數(shù)據(jù)。2 .運(yùn)算符重載必須保持其原來(lái)的優(yōu)先級(jí)【提示】運(yùn)算符重載不能改變操作數(shù)的個(gè)數(shù)、運(yùn)算符的優(yōu)先級(jí)、運(yùn)算符的結(jié)合性、運(yùn)算符 的語(yǔ)法結(jié)構(gòu)。3 .運(yùn)算符“ +重載后,若希望該運(yùn)算符滿足交換性,可將其重載為【提示】 成員函數(shù)重載時(shí),其左操作數(shù)必須是類的對(duì)象,如果右操作數(shù)是一個(gè)其它數(shù)據(jù)類型,就 不可以實(shí)現(xiàn)交換。友元函數(shù)重載時(shí),只需要兩個(gè)

20、操作數(shù)中,其中一個(gè)是類的對(duì)象,這兩個(gè)操作數(shù)都作為參 數(shù),所以可滿足運(yùn)算符“ +”勺可交換性。即執(zhí)行 SI+S2和S2+SI的結(jié)果是相同的,從而滿足運(yùn)算符“ +”勺交換性。來(lái)實(shí)現(xiàn)。4 .運(yùn)算符重載一種是通過(guò)成員函數(shù)來(lái)實(shí)現(xiàn),另一種是通過(guò)5 .當(dāng)用成員函數(shù)重載雙目運(yùn)算符時(shí),運(yùn)算符的左操作數(shù)必定是改寫程序題1 .復(fù)數(shù)類Complex,將運(yùn)算符“ 以成員函數(shù)形式重載,實(shí)現(xiàn)兩復(fù)數(shù)相加。試采用友元函 數(shù)改寫該程序中的運(yùn)算符重載函數(shù)。#in eludeclass Complex float real , image ;public:CompI ex( float r=0 , float i=0 : real(

21、 r , image( i Complex op erator+( Complex &c retur n CompI ex( real+c.real , image+c.image ; void show( if ( image >= 0 cout << real << '+' << image << 'i' << endl ;else cout << real << '-' << (-image << 'i'

22、 << endl ; ;void mai n( Comp lex c1( 1 , 2 , c2( -3 , -4 , c3 ;c3 = c1 + c2 ;c3.show(;改寫程序如下:【答案】?編程題1.編寫程序:存放在 myComplex.cpp文件中,包含內(nèi)容如下:定義復(fù)數(shù)類Complex。私有成員數(shù)據(jù)有:存放實(shí)部、虛部值的real、image。公有成員函數(shù)有:可設(shè)置復(fù)數(shù)實(shí)部、虛部值的成員函數(shù)void set( float r=0 , float i=0;可按“3+5i ”(或” 3i ” 格式輸出復(fù)數(shù)的成員函數(shù) void show(;構(gòu)造函數(shù) Complex ( float

23、 r=0 , floati=0。用成員函數(shù)方式重載運(yùn)算符:前置+”、量和減量運(yùn)算。后置+”、前置-”、后置-”,實(shí)現(xiàn)復(fù)數(shù)的增用友元函數(shù)方式重載運(yùn)算符:“ +、“'、算?!?=,”實(shí)現(xiàn)復(fù)數(shù)的雙目運(yùn)編寫main(函數(shù)去測(cè)試Complex類。編寫程序如下:【答案】?2 .編寫程序:改寫第1題,要求如下:將第1題中的改用友元函數(shù)方式重載運(yùn)算符: -”,實(shí)現(xiàn)復(fù)數(shù)的增量和減量運(yùn)算。前置+”、后置+”、前置-”、后置-將第1題中的改用成員函數(shù)方式重載運(yùn)算符: 復(fù)數(shù)的雙目運(yùn)算?!?=” 丄”,“ =” “!=,” 實(shí)現(xiàn)編寫程序如下:【答案】?3.編寫程序:存放在 myStude nt.c pp文件中,

24、包含內(nèi)容如下:id、 name、Student。私有成員數(shù)據(jù)有:存放學(xué)號(hào)、姓名、成績(jī)值的void set( int i=0 , char *na =定義學(xué)生類 score。公有成員函數(shù)有:可設(shè)置學(xué)生值的成員函數(shù) s=0 ;可按 學(xué)號(hào)=04081111姓名=張小笑 成績(jī)=99”格式輸出的成員函數(shù) void show(; 構(gòu)造函數(shù) Student ( int i=0 , char *na =” , int s=0用友元函數(shù)方式重載關(guān)系運(yùn)算符:大于>”、小于 <”,實(shí)現(xiàn)兩個(gè)學(xué)生的比較運(yùn)算,學(xué)生之間的比較按其成績(jī)比較,成績(jī)高的學(xué)生”大于 成績(jī)低的學(xué)生”。friend bool op era

25、tor> ( Stude nt &s1 , Stude nt &s2 ;friend boo lop eratorv ( Stude nt &s1 , Stude nt &s2 ;用友元函數(shù)方式 重載運(yùn)算符:提取 >> ”、插入Vv ”,實(shí)現(xiàn)學(xué)生數(shù)據(jù)的整體輸入和輸出。friend istream & operator>> ( istream &in , Student &s ;friend ostream & op eratorvv ( ostream & out , Stude nt &am

26、p;s ;編寫main(函數(shù):定義學(xué)生數(shù)組 Student 6 ,實(shí)現(xiàn)學(xué)生數(shù)據(jù)的鍵盤輸入、降序排序、 并將排序后的學(xué)生數(shù)據(jù)輸出到顯示器、文件(Stude nt.txt )中各1份。編寫程序如下:【答案】?4.編寫程序:自定義一個(gè)字符串類 mystri ng ,其聲明部分存放在 mystri ng.h 頭文件中,其成員函數(shù) 的實(shí)現(xiàn)部分存放在 mystri ng.cp p文件中,定義內(nèi)容如下:成員數(shù)據(jù):char s N ;用于存放字符串的數(shù)組容器,其中N為常量 int size ;數(shù)組中最多可容納的元素?cái)?shù), size = N int last ;數(shù)組中已用元素的最大下標(biāo),空串時(shí)last = 0成員

27、函數(shù):構(gòu)造函數(shù):mystri ng (;mystri ng ( char * ;mystri ng ( mystri ng & ;可省略不寫析構(gòu)函數(shù):-mystring ( ; /可省略不寫成員重載運(yùn)算符:mystri ng op erator + ( mystri ng & ;mystri ng op erator + ( char * ;mystri ng & op erator += ( mystri ng & ;mystri ng & op erator += ( char * ;mystri ng op erator = ( mystr ing

28、 & ;/ 可省略不寫mystri ng & op erator = ( char * ;bool op erator < ( mystr ing & ;bool op erator < ( char * ;bool op erator = ( mystri ng & ;bool op erator = ( char * ;char & op erator ( int ;友元重載運(yùn)算符:istream & op erator >> ( istream & , mystri ng & ;ostream &am

29、p; op erator << ( ostream & , mystri ng & ;編寫main(函數(shù)對(duì)字符串類mystring進(jìn)行測(cè)試。編寫程序如下:【答案】?4 .(選做)編寫程序:存放在myBirth.cpp文件中,包含內(nèi)容如下:定義生日類Birth。私有成員數(shù)據(jù)有:存放年、月、日值的 year、month、day。公有成 員函數(shù)有:可設(shè)置生日的成員函數(shù)void set( int y=0 , int m=0 , int d=0; 可按 生日= 1990/12 /06 ”格式輸出生日的成員函數(shù)void showBirth(;可按 年齡=20 ”格式輸出年齡的成

30、員函數(shù) void showAge(;構(gòu)造函數(shù) Birth( int y=0 , int m=0 , int d=0;構(gòu)造函數(shù)Birth( char *s ,其參數(shù)值為以“yyyy/mm/dd形式給出的字符串。定義類型轉(zhuǎn)換成員函數(shù) op erator int (;將生日數(shù)據(jù)轉(zhuǎn)換為整型數(shù)據(jù)年齡。用友元函數(shù)重載運(yùn)算符>”、<”、=”,實(shí)現(xiàn)兩個(gè)生日之間的比較運(yùn)算。如:表達(dá)式Birth("2002/10/01" > Birth("2001/01/10" ,表示 2002 年 10 月 1 日在 2001 年 1 月 10 日之 后; 表達(dá)式Birth("2005/10/01 = Birth(5, 10, 1,表示兩個(gè)生日是同一天。編寫main(函數(shù)去測(cè)試Bir

溫馨提示

  • 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)論