作業(yè)━━第5章(4)━━運算符重載._第1頁
作業(yè)━━第5章(4)━━運算符重載._第2頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

2、載為友元函數(shù)。6掌握幾個特殊運算符 “ +” -”、“ =”“”“的重載。7 掌握類型轉(zhuǎn)換函數(shù)。&掌握自定義字符串類。9 掌握 C+標準庫中的 string 類的使用?!纠}分析】1 下面程序中的錯誤有幾處?#in eludeclass C int x , y ;public:C ( int a , int b : x( a , y( b C operator ( C a C temp ; temp.x=x+a.x ; temp.y=y+a.y ; return temp ; int operator# ( C a return ( x * y ; frie nd C operator

3、= ( C a x=a.x ; y=b.y ; retur n *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【解析】1函數(shù) C operator (C a ;運算符重載是允許用戶重新定義運算符的含義,但此運算符必須是 C+系統(tǒng)預定義的,而”不是 C+預定義的運算符,應換成 + ”。2函數(shù) int operator# (C a ;符號#不允許重載,應換成*”,另外形參 C a 也不需要。3函數(shù) friend C operato

4、r = (C a ; 賦值運算符=只能重載為成員函數(shù),不能重載為友元函數(shù),故將 friend 刪去。其次,返回類型最好是C &。2 .編寫程序:存放在 my Vector .cpp 文件中,包含內(nèi)容如下:定義向量類 Vector。私有成員數(shù)據(jù)有:存放 向量在三條坐標軸上投影值的 x、y、z。 公有成員函數(shù)有:可設置 向量中 x、y、z 值的成員函數(shù) void set( float a=0, float b=0, float c=0 ;可輸出向量中 x、y、z 值的成員函數(shù) void show(;構(gòu)造函數(shù) Vector ( float a=0 , float b=0 , float c=

5、0 ;構(gòu)造函數(shù)Vector ( float v 3 ;兩個賦值運算符 =重載成員函數(shù) Vector & operator=( Vector v 、Vector &operator=( float v 3 。將實現(xiàn)兩個向量之間加、減、乘運算 的三個獨立函數(shù)聲明為 Vector 類的友元函數(shù):frie nd Vector operator+( Vector v1 , Vector v2 ;frie nd Vector operator-( Vector v1 , Vector v2 ;frie nd float operator*( Vector v1 , Vector v2 ;3

6、編寫 main(函數(shù)去測試,完成向量間的運算。【提示】若向量 a 在三條坐標軸上的投影為 ax , ay , az,則表達式 a = ax , ay , az 稱 為向量 a的坐標表達式。設有兩個向量a 和 b,它們之間的加、減、乘的運算公式為:a + b = ax +bx , ay +by , az+bz a - b = ax -bx , ay -by , az-bz a * b = ax *bx + ay *by + az *bz將運算符+ ”、“”、 * ”和=”重載,實現(xiàn)向量間的加、減、乘、賦值運算。【答案】編寫程序如下 :#i nclude#i ncludeclass Vector

7、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 ( (y0 ? - : + fabs(y j;cout ( (z0 ? - : + fabs(z k endl ; Vector & operator=( Vector v ;V

8、ector & operator=( float v 3 ;friend Vector operator+( Vector v1 , Vector v2 ;friend Vector operator-( Vector v1 , Vector v2 ;friend float operator*( 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

9、x=v0 ; y=v1 ; z=v2 ; return *this ; Vector operator+( 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 ; Vector operator-( 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 operator*(

10、 Vector v1 , Vector v2 return ( v1.x*v2.x + v1.y*v2.y + v1.z*v2.z ; void main( float 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 ;【解析】定義向量類,并對各運算符進行重載。本程序采用友元函數(shù)重載“ +” -”算符,在此也可采用成員函數(shù)重載,從程序可讀性考慮,一般認為雙目運算符,重載為友 元函數(shù)

11、更好些。但重載 “進算符必須用成員函數(shù)?!舅伎碱}】【答案】?選擇題1.下面運算符中,不能重載的是 _ 。A.?:B.+spanC . *D.ob2 被 C+編譯器解釋為 _。Aoperator( obl , ob2B(ob1 , ob2Cob2.operator( ob1Dob1.operator( ob2【答案】 ? ?【提示】友元函數(shù)重載運算符的調(diào)用形式:operatorv 運算符 ( , 等價于表達式: 5 若 a+b 運算需通過成員函數(shù)實現(xiàn)“ +運算符重載,下面描述中正確的是 _ 。A a 必須為該類對象,b 可為其它數(shù)據(jù)類型B a 和 b 都必須為該類對象C b 必須為該類對象,a

12、可為其它數(shù)據(jù)類型D a 和 b 均可為其它數(shù)據(jù)類型【答案】?【提示】成員函數(shù)實現(xiàn) a+b 時,編譯器解釋為:a.operator(b ,因此左操作數(shù) a 必須為該 類對象,否則無法實現(xiàn)成員函數(shù)的調(diào)用,而右操作數(shù)可以是該類的對象,也可以是其它數(shù) 據(jù)類型。6 MA 是一個類名,下面重載運算符的成員函數(shù)原型 中不正確的是 _。A MA operator-(;B MA operator-( MA ;C MA operator-( MA & ;D MA operator-( MA , MA ;friend fun operator+( fun & ;【提示】運算符“”可以是單目運算符的

13、負”運算,也可以是雙目運算符的 減”運算,因 此成員函數(shù)實現(xiàn)時,可以不帶參數(shù) (實現(xiàn)一元運算,也可以帶一個參數(shù)(實現(xiàn)二元運算,但 不可能是兩個參數(shù)。7 .有下面類定義,并在類外對“ +運算符重載函數(shù)進行定義,其中 不正確的是 _。class Point int x , y ;public:Point operator+(;;A . Point Point: operator+( x+ ; y+ ; return *this ; B.Point Point: operator+( x+=5 ; y+=5 ; return *this ; C.Point Point: operator+( x-

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

15、list: operator=( const list &a ;C.bool & list: operator=( const list &a ;D.bool list: operator=( const list &a ;【答案】?9.有下面類定義,若主函數(shù)中有定義:fun m , c , d ;則執(zhí)行語句 c=+m;編譯器將其中的+m 解釋為_ 。class fun public: fun operator+=( fun ;OA.c.operator+( m ;B.m=operator+( m ;C . m.operator+( m ;D . operato

16、r+( m ;【答案】?10 .在上題中,若執(zhí)行語句 d+=m;編譯器將其解釋為 _。A.d=operator+=( m ;B.m=operator+=( d ;C.d.operator+=( m ;D.m.operator+=( d ;【答案】?11.有下面類定義,若類外執(zhí)行語句a=b+c;編譯器將其中的 b+c 解釋為:operator +( b,c ;則下面描述中正確的是 _ 。class Comfrie nd Com operator+( . ; ;A. a、b、c 都必須是 Com 的對象。B . a、b 都必須是 Com 的對象。C . a 必須是 Com 的對象,而 b 和 c

17、中只要有一個是 Com 的對象即可D . b、c 都必須是 Com 的對象?!敬鸢浮??填空題1 .雙目運算符重載為類的成員函數(shù)時,其左操作數(shù)必須是 _ ,而右操作數(shù)可以是【提示】將雙目運算符重載為類的成員函數(shù)時,由于this 指針在非靜態(tài)成員函數(shù)操作對象時都作為第一個隱式參數(shù)傳遞了對象,它充當了雙目運算符的左操作數(shù),而該成員函數(shù) 的形參則表示雙目運算符的右操作數(shù)。因此左操作數(shù)必須是該類的對象,而右操作數(shù)可以 是類型與形參類型兼容的數(shù)據(jù)。2 .運算符重載必須保持其原來的優(yōu)先級、_、_ 。【提示】運算符重載不能改變操作數(shù)的個數(shù)、運算符的優(yōu)先級、運算符的結(jié)合性、運算符 的語法結(jié)構(gòu)。3 .運算符“ +

18、重載后,若希望該運算符滿足交換性,可將其重載為 _ ?!咎崾尽?成員函數(shù)重載時,其左操作數(shù)必須是類的對象,如果右操作數(shù)是一個其它數(shù)據(jù)類型,就 不可以實現(xiàn)交換。2友元函數(shù)重載時,只需要兩個操作數(shù)中,其中一個是類的對象,這兩個操作數(shù)都作為參數(shù),所以可滿足運算符 “ +”勺可交換性。即執(zhí)行 sl+s2 和 s2+sl 的結(jié)果是相同的,從而滿 足運算符“ +”勺交換性。4 .運算符重載一種是通過成員函數(shù)來實現(xiàn),另一種是通過 _來實現(xiàn)。5 .當用成員函數(shù)重載雙目運算符時,運算符的左操作數(shù)必定是 _ 。改寫程序題1 .復數(shù)類 Complex,將運算符“ 以成員函數(shù)形式重載,實現(xiàn)兩復數(shù)相加。試采用友元函 數(shù)

19、改寫該程序中的運算符重載函數(shù)。#i ncludeclass Complex float real , image ;public:Complex( float r=0 , float i=0 : real( r , image( i Complex operator+( Complex &c retur n Complex( real+c.real , image+c.image ; void show( if ( image = 0 cout real + image i endl ;else cout real - (-image i ”、小于”,實現(xiàn)兩個學生的比較運算,學生之間的

20、比較按其成績比較,成績高的學生”大于 成績低的學生”。friend bool operator( Stude nt &s1 , Stude nt &s2 ;frie nd bool operator ”、插入 ”,實現(xiàn)學生數(shù)據(jù)的整體輸入和輸出。friend istream & operator( istream &n , Student &s ;frie nd ostream & operator ( ostream & out , Stude nt &s ;4編寫 main(函數(shù):定義學生數(shù)組 Student 6 ,實現(xiàn)學生數(shù)據(jù)

21、的鍵盤輸入、降序排序、并將排序后的學生數(shù)據(jù)輸出到顯示器、文件(Stude nt.txt )中各 1 份。編寫程序如下:【答案】?4.編寫程序:自定義一個字符串類 mystri ng ,其聲明部分存放在 mystri ng.h 頭文件中,其成員函數(shù) 的實現(xiàn)部分存放在 mystri ng.cpp文件中,定義內(nèi)容如下:成員數(shù)據(jù):1char s N ;用于存放字符串的數(shù)組容器, 其中N 為常量2int size ;數(shù)組中最多可容納的元素數(shù),size = N3int last ;數(shù)組中已用元素的最大下標,空串時last = 0成員函數(shù):1構(gòu)造函數(shù):mystri ng (;定義類型轉(zhuǎn)換成員函數(shù)operat

22、or int (;將生日數(shù)據(jù)轉(zhuǎn)換為整型數(shù)據(jù)年齡mystri ng ( char * ;mystri ng ( mystri ng & ;可省略不寫2析構(gòu)函數(shù):mystring ( ; /可省略不寫3成員重載運算符: mystri ng operator + ( mystri ng & ;mystri ng operator + ( char * ;mystri ng & operator += ( mystri ng & ;mystri ng & operator += ( char * ;mystri ng operator = ( mystri ng

23、 & ;/ 可省略不寫mystri ng & operator = ( char * ;bool operator ( mystri ng & ;bool operator ( istream & , mystring & ;ostream & operator ”、 Birth(2001/01/10 ,表示 2002 年 10 月 1 日在 2001 年 1 月 10 日之 后;表達式 Birth(2005/10/01 = Birth(5, 10, 1,表示兩個生日是同一天。4編寫 main(函數(shù)去測試 Birth 類。【提示】庫函數(shù) time(原型:Io ng time( long * t ;功能:提取當前時間,即從1970/0

溫馨提示

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

評論

0/150

提交評論