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

下載本文檔

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

文檔簡介

1、 面向?qū)ο蟪绦蛟O(shè)計-多態(tài)性 * 運算符重載為友元函數(shù) 運算符也可以重載為類的友元函數(shù),這樣它就可以自由地訪問該類的任何數(shù)據(jù)成員。這時,運算所需要的操作數(shù)都需要通過函數(shù)的形參表來傳遞,在參數(shù)表中形參從左到右的順序就是運算符操作數(shù)的順序。但是,有些運算符不能重載為友元,如“=”、“()”、“”和“-”。運算符重載為友元運算符重載為友元 面向?qū)ο蟪绦蛟O(shè)計-多態(tài)性 1雙目運算:oprdl B oprd2 對于雙目運算符B,如果opr dl為A類的對象,則應當把B重載為A類的友元函數(shù),該函數(shù)有兩個形參,其中一個形參的類型是A類。經(jīng)過重載之后,表達式oprdl B oprd2就相當于函數(shù)調(diào)用operato

2、r B (oprdl,oprd2)。 運算符重載為友元運算符重載為友元函數(shù)名函數(shù)名 面向?qū)ο蟪绦蛟O(shè)計-多態(tài)性 2單目運算 1)前置單目運算:U oprd 對于前置單目運算符U,如“-”(負號)等,如果要實現(xiàn)表達式U oprd(其中oprd為A類的對象),則U可以重載為A類的友元函數(shù),函數(shù)的形參為A類的對象。經(jīng)過重載之后,表達式U oprd相當于函數(shù)調(diào)用operator U (oprd)。運算符重載為友元運算符重載為友元 面向?qū)ο蟪绦蛟O(shè)計-多態(tài)性 2)后置單目運算:oprd V 對于后置運算符V,如“+”和“-”,如果要實現(xiàn)表達式oprd +或oprd -(其中oprd為A類的對象),那么運算符

3、就可以重載為A類的友元函數(shù),這時函數(shù)的形參有兩個,一個是A類的對象oprd,另一個是整型(int)形參。重載之后,表達式oprd+和oprd-就相當于函數(shù)調(diào)用operator+ (oprd,0)和operator- (oprd,0)。運算符重載為友元運算符重載為友元 面向?qū)ο蟪绦蛟O(shè)計-多態(tài)性 【例3】雙目運算符重載為友元重載例題。#includeclass point private:float x,y; 運算符重載為友元 面向?qū)ο蟪绦蛟O(shè)計-多態(tài)性 運算符重載為友元運算符重載為友元public: point(float xx=0,float yy=0)x=xx;y=yy; float get_

4、x()return x; float get_y()return y; friend point operator+(point p1,point p2);/重載運算符“+” friend point operator-(point p1,point p2) ;/和“-”為友元函數(shù); 面向?qū)ο蟪绦蛟O(shè)計-多態(tài)性 point operator+(point p1,point p2) return point(p1.x+p2.x,p1.y+p2.y); point operator-(point p1,point p2) return point(p1.x-p2.x,p1.y-p2.y); 運算符重

5、載為友元運算符重載為友元 面向?qū)ο蟪绦蛟O(shè)計-多態(tài)性 void main() point p1(3,3),p2(2,2),p3,p4; p3=p1+p2; /兩點相加 p4=p1-p2; /兩點相減 coutp3.get_x() p3.get_y()endl; coutp4.get_x() p4.get_y()endl; 運算符重載為友元 面向?qū)ο蟪绦蛟O(shè)計-多態(tài)性 練習、定義一個復數(shù)類complex,重載運算符“”,使之能用于復數(shù)的加法運算,參加運算的兩個運算量可以都是復數(shù)類對象,也可以其中有一個是整數(shù),順序任意。例如:c1+c2,c1+i,i+c1,c1+=c2均合法,編程:分別求兩個復數(shù)之和

6、,整數(shù)和復數(shù)之和。運算符重載 面向?qū)ο蟪绦蛟O(shè)計-多態(tài)性 賦值運算符“=”的重載對任一類對任一類X,如果沒有用戶自定義的賦值運算符如果沒有用戶自定義的賦值運算符函數(shù)函數(shù),那么系統(tǒng)自動地為其生成一個缺省的賦值那么系統(tǒng)自動地為其生成一個缺省的賦值運算符函數(shù)運算符函數(shù),定義為類定義為類X中的成員到成員的賦值中的成員到成員的賦值,例如例如: X &X:operator=(const X& source) /成員間賦值成員間賦值 面向?qū)ο蟪绦蛟O(shè)計-多態(tài)性 若若obj1和和obj2是類是類X的兩個對象的兩個對象,obj2已被已被創(chuàng)建創(chuàng)建,則編譯程序遇到如下語句則編譯程序遇到如下語句: obj

7、1=obj2; 就調(diào)用缺省的賦值運算符函數(shù)就調(diào)用缺省的賦值運算符函數(shù),將對象將對象obj2的數(shù)據(jù)成員的值逐個賦給對象的數(shù)據(jù)成員的值逐個賦給對象obj1的對應數(shù)據(jù)的對應數(shù)據(jù)成員中。成員中。 賦值運算符“=”的重載 面向?qū)ο蟪绦蛟O(shè)計-多態(tài)性 1.指針懸掛問題指針懸掛問題 在某些特殊情況下在某些特殊情況下,如類中有指針類型時如類中有指針類型時,使用缺使用缺省的賦值運算符函數(shù)會產(chǎn)生錯誤。省的賦值運算符函數(shù)會產(chǎn)生錯誤。例例 使用缺省的賦值運算符函數(shù)產(chǎn)生錯誤的例子。使用缺省的賦值運算符函數(shù)產(chǎn)生錯誤的例子。 #include #include class string 賦值運算符“=”的重載 面向?qū)ο蟪绦蛟O(shè)

8、計-多態(tài)性 public: string(char *s) ptr=new charstrlen(s)+1; strcpy(ptr,s); string() delete ptr; void print() coutptrendl; 賦值運算符“=”的重載 面向?qū)ο蟪绦蛟O(shè)計-多態(tài)性 private: char *ptr; ; void main() string p1(“book”),p2(pen); p1=p2; coutp2:; p2.print(); coutp1:; p1.print(); 賦值運算符“=”的重載 面向?qū)ο蟪绦蛟O(shè)計-多態(tài)性 2. 重載賦值運算符解決指針懸掛問題重載賦值運

9、算符解決指針懸掛問題 為了解決上述使用缺省的賦值運算符所遇到的為了解決上述使用缺省的賦值運算符所遇到的指針懸掛問題指針懸掛問題,必須重載賦值運算符必須重載賦值運算符,使得對目標對使得對目標對象數(shù)據(jù)成員指針的賦值象數(shù)據(jù)成員指針的賦值,是把原對象指針是把原對象指針ptr所指向所指向的內(nèi)容傳遞給它的內(nèi)容傳遞給它,而不是簡單地傳遞指針值。而不是簡單地傳遞指針值。 賦值運算符“=”的重載 面向?qū)ο蟪绦蛟O(shè)計-多態(tài)性 例:例: 重載賦值運算符解決重載賦值運算符解決指針懸掛指針懸掛問題。問題。 #include #include class string private: char *ptr; 賦值運算符“=

10、”的重載 面向?qū)ο蟪绦蛟O(shè)計-多態(tài)性 public: string(char *s) ptr=new charstrlen(s)+1; strcpy(ptr,s); string() delete ptr; void print() coutptrendl; ; 賦值運算符“=”的重載 面向?qū)ο蟪绦蛟O(shè)計-多態(tài)性 string& operator=(const string&s) if (this=&s) return *this; / 防止防止s=s的賦值的賦值 delete ptr; / 釋放掉原區(qū)域釋放掉原區(qū)域 ptr=new charstrlen(s.ptr)+1;

11、 / 分配分配新區(qū)域新區(qū)域 strcpy(ptr,s.ptr); / 字符串拷貝字符串拷貝 return *this; 賦值運算符“=”的重載 面向?qū)ο蟪绦蛟O(shè)計-多態(tài)性 void main() string p1(book); string p2(pen); p1=p2; coutp2:; p2.print(); coutp1:; p1.print(); 賦值運算符“=”的重載 面向?qū)ο蟪绦蛟O(shè)計-多態(tài)性 *其它運算符重載 比較運算符重載(如,=,=,!=)。 賦值運算符重載(如=,+=,-=,*=,/=)。 下標運算符“”重載。 下標運算符“”通常用于取數(shù)組中的某個元素,通過下標運算符重載,可

12、以實現(xiàn)數(shù)組下標的越界檢測等。 運算符重載 面向?qū)ο蟪绦蛟O(shè)計-多態(tài)性 運算符new和delete重載。 通過重載new和delete,可以克服new和delete的不足,使其按要求完成對內(nèi)存的管理。逗號運算符“,”重載。 逗號運算符構(gòu)成的表達式為“左操作數(shù),右操作數(shù)”,該表達式返回右操作數(shù)的值。運算符重載 面向?qū)ο蟪绦蛟O(shè)計-多態(tài)性 流運算符的重載 的流插入運算符“”是在類庫中提供的,所有編譯系統(tǒng)都在類庫中提供輸入流類istream和輸出流類ostream。cin和cout分別是istream類和ostream類的對象。在類庫提供的頭文件中已經(jīng)對“”進行了重載,使之作為流插入運算符和流提取運算符,

13、能用來輸入和輸出標準類型的數(shù)據(jù)。因此,凡是用到“cin”和“cout”的地方都要用 #include 將頭文件包含到本程序文件中。流運算符的重載 面向?qū)ο蟪绦蛟O(shè)計-多態(tài)性 用戶自定義的類型的數(shù)據(jù)(如:程序中需要輸入和輸出復數(shù)類的對象),是不能直接用“”來輸入和輸出的,如果想用它們來輸入和輸出自己聲明的類型的數(shù)據(jù),就必須要對它們進行重載。 思考: 對插入“”運算符的重載定義成一個類的成員函數(shù)還是類的友元函數(shù)。流運算符的重載 面向?qū)ο蟪绦蛟O(shè)計-多態(tài)性 因為這兩個操作符的左邊是流而不是被操作的對象,因此對它們只能夠重載為友元函數(shù)。 插入運算符重載的一般形式: ostream & operat

14、or(istream &函數(shù)的流,類名對象名)/函數(shù)代碼return函數(shù)的流;流運算符的重載 面向?qū)ο蟪绦蛟O(shè)計-多態(tài)性 例:對用戶自定義類型(復數(shù)類complex)的對象進行輸入和輸出。#include class complex double real; double imag; 流運算符的重載 面向?qū)ο蟪绦蛟O(shè)計-多態(tài)性 public: friend ostream & operator(istream &in,complex &b);流運算符的重載 面向?qū)ο蟪绦蛟O(shè)計-多態(tài)性 istream & operator(istream &in,complex &b) coutb.realb.imag; return in;流運算符的重載 面向?qū)ο蟪绦蛟O(shè)計-多態(tài)性 ostream&operator(ostream &out,complex &a) out (a.real, a.imagc1c2; coutc1=c1endl; coutc2=c2endl; return 0;流運算符的重載 面向?qū)ο蟪绦蛟O(shè)計-多態(tài)性 運行結(jié)果:input real part and imag part of complex number:3 6 input real p

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論