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

下載本文檔

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

文檔簡介

1、第三章第三章 運(yùn)算符重載運(yùn)算符重載主講:李梅蓮主要內(nèi)容主要內(nèi)容l3.1什么是運(yùn)算符重載什么是運(yùn)算符重載l3.2運(yùn)算符重載的方法運(yùn)算符重載的方法l3.3重載運(yùn)算符的規(guī)則重載運(yùn)算符的規(guī)則l3.4運(yùn)算符重載函數(shù)作為類成員函數(shù)和友元函數(shù)運(yùn)算符重載函數(shù)作為類成員函數(shù)和友元函數(shù)l3.5重載雙目運(yùn)算符重載雙目運(yùn)算符l3.6重載單目運(yùn)算符重載單目運(yùn)算符l3.7重載流插入運(yùn)算符和流提取運(yùn)算符重載流插入運(yùn)算符和流提取運(yùn)算符l 3.7.1重載流插入運(yùn)算符重載流插入運(yùn)算符“”l3.8不同類型數(shù)據(jù)間的轉(zhuǎn)換不同類型數(shù)據(jù)間的轉(zhuǎn)換l 3.8.1標(biāo)準(zhǔn)類型數(shù)據(jù)間的轉(zhuǎn)換標(biāo)準(zhǔn)類型數(shù)據(jù)間的轉(zhuǎn)換l 3.8.2轉(zhuǎn)換構(gòu)造函數(shù)轉(zhuǎn)換構(gòu)造函數(shù)l

2、3.8.3類型轉(zhuǎn)換函數(shù)類型轉(zhuǎn)換函數(shù)3.1 運(yùn)算符重載基礎(chǔ)運(yùn)算符重載基礎(chǔ)l運(yùn)算符重載是運(yùn)算符重載是對(duì)已有的運(yùn)算符賦予多重含義對(duì)已有的運(yùn)算符賦予多重含義l必要性必要性lC+中預(yù)定義的運(yùn)算符其運(yùn)算對(duì)象只能是基本數(shù)據(jù)類型,而中預(yù)定義的運(yùn)算符其運(yùn)算對(duì)象只能是基本數(shù)據(jù)類型,而不適用于用戶自定義類型(如類)不適用于用戶自定義類型(如類)l實(shí)現(xiàn)機(jī)制實(shí)現(xiàn)機(jī)制l將指定的運(yùn)算表達(dá)式轉(zhuǎn)化為對(duì)運(yùn)算符函數(shù)的調(diào)用,運(yùn)算對(duì)象將指定的運(yùn)算表達(dá)式轉(zhuǎn)化為對(duì)運(yùn)算符函數(shù)的調(diào)用,運(yùn)算對(duì)象轉(zhuǎn)化為運(yùn)算符函數(shù)的實(shí)參。轉(zhuǎn)化為運(yùn)算符函數(shù)的實(shí)參。l編譯系統(tǒng)對(duì)重載運(yùn)算符的選擇,遵循函數(shù)重載的選擇原則。編譯系統(tǒng)對(duì)重載運(yùn)算符的選擇,遵循函數(shù)重載的選擇原則

3、。3.1 運(yùn)算符重載基礎(chǔ)運(yùn)算符重載基礎(chǔ)復(fù)數(shù)運(yùn)算舉例復(fù)數(shù)運(yùn)算舉例class complex/復(fù)數(shù)類聲明復(fù)數(shù)類聲明public:complex(double r=0.0,double i=0.0) real=r;imag=i; /構(gòu)造函數(shù)構(gòu)造函數(shù)void display(); /顯示復(fù)數(shù)的值顯示復(fù)數(shù)的值private:double real;double imag;問能否用問能否用“+”實(shí)現(xiàn)兩個(gè)復(fù)數(shù)相加呢?(演示回答)實(shí)現(xiàn)兩個(gè)復(fù)數(shù)相加呢?(演示回答)3.1運(yùn)算符重載基礎(chǔ)運(yùn)算符重載基礎(chǔ)例例3.1通過函數(shù)實(shí)現(xiàn)復(fù)數(shù)相加(沒有用運(yùn)算符重載)通過函數(shù)實(shí)現(xiàn)復(fù)數(shù)相加(沒有用運(yùn)算符重載)#include usin

4、g namespace std;class Complex public: Complex()real=0;imag=0; Complex(double r,double i)real=r;imag=i; Complex complex_add(Complex &c2); void display(); private: double real; double imag; ;Complex Complex:complex_add(Complex &c2)return Complex(real+c2.real,imag+c2.imag); void Complex:display

5、()cout(real,imagi)endl;int main() Complex c1(3,4),c2(5,-10),c3; c3=plex_add(c2); coutc1=; c1.display(); coutc2=; c2.display(); coutc1+c2=; c3.display(); return 0;結(jié)果正確,調(diào)用方式不直觀,太繁瑣,使人不方便結(jié)果正確,調(diào)用方式不直觀,太繁瑣,使人不方便3.2 運(yùn)算符重載的方法運(yùn)算符重載的方法l聲明形式聲明形式函數(shù)類型函數(shù)類型 operator 運(yùn)算符(形參)運(yùn)算符(形參) .l重載為類成員函數(shù)時(shí)重載為類成員函數(shù)時(shí) 參數(shù)個(gè)數(shù)參數(shù)個(gè)數(shù)=原操

6、作數(shù)個(gè)數(shù)原操作數(shù)個(gè)數(shù)-1(后置(后置+、-除外)除外)l重載為友元函數(shù)時(shí)重載為友元函數(shù)時(shí) 參數(shù)個(gè)數(shù)參數(shù)個(gè)數(shù)=原操作數(shù)個(gè)數(shù)原操作數(shù)個(gè)數(shù),且至少,且至少應(yīng)該有一個(gè)自定義類型的形參。應(yīng)該有一個(gè)自定義類型的形參。3.2 運(yùn)算符重載的方法運(yùn)算符重載的方法#include using namespace std;class Complex public: Complex()real=0;imag=0; Complex(double r,double i)real=r;imag=i; Complex operator + (Complex &c2); void display(); private:

7、 double real; double imag; ;Complex Complex:operator + (Complex &c2)Complex c; c.real=real+c2.real; c.imag=imag+c2.imag;return c; void Complex:display()cout(real,imagi)endl;int main()Complex c1(3,4),c2(5,-10),c3; c3=c1+c2; /等價(jià)于等價(jià)于c1.operator+(c2) coutc1=;c1.display(); coutc2=;c2.display(); cout(

8、 ) -必須是成員函數(shù)必須是成員函數(shù)+= -= /= += -= /= * *= = &= != %= = = &= != %= = = =建議使用成員函數(shù)建議使用成員函數(shù)所有其它二元運(yùn)算符所有其它二元運(yùn)算符, , 例如例如: : ,+,+,* *,/,/建議使用友元函數(shù)建議使用友元函數(shù)必須是友元函數(shù)必須是友元函數(shù)表3-2 運(yùn)算符重載規(guī)則3.4運(yùn)算符重載函數(shù)作為類成員函數(shù)和運(yùn)算符重載函數(shù)作為類成員函數(shù)和友元函數(shù)友元函數(shù)#include using namespace std;class Complex public: Complex()real=0;imag=0; Comple

9、x(double r)real=r;imag=0; Complex(double r, double i)real=r;imag=i; friend Complex operator+ (Complex &c1,Complex &c2); void display(); private: double real; double imag; ; Complex operator+ (Complex &c1,Complex &c2) return Complex(c1.real+c2.real, c1.imag+c2.imag);void Complex:displ

10、ay()cout(real,imagi)endl;int main()Complex c1(3,4),c2(5,-10),c3; c3=c1+c2; /等價(jià)于等價(jià)于operator+(c1,c2) coutc1=; c1.display(); coutc2=; c2.display(); coutc1+c2=; c3.display(); return 0;3.5重載單目運(yùn)算符重載單目運(yùn)算符重載自增運(yùn)算符重載自增運(yùn)算符+#include using namespace std;class Timepublic: Time()minute=0;sec=0; Time(int m,int s):m

11、inute(m),sec(s) Time operator+(); void display()coutminute:sec=60) sec-=60; +minute; return *this; int main()Time time1(34,0); for (int i=0;i61;i+)+time1; time1.display(); return 0;3.6重載單目運(yùn)算符重載單目運(yùn)算符為區(qū)別前置自增運(yùn)算符和后置自增運(yùn)算符,為區(qū)別前置自增運(yùn)算符和后置自增運(yùn)算符,為為后置自增運(yùn)算符加一個(gè)整形參數(shù)后置自增運(yùn)算符加一個(gè)整形參數(shù)class Timepublic: Time()minute=0;s

12、ec=0; Time(int m,int s):minute(m),sec(s) Time operator+(); Time operator+(int); void display()coutminute:sec=60) sec-=60; +minute; return *this;Time Time:operator+(int)Time temp(*this); sec+; if(sec=60) sec-=60; +minute; return temp;3.7重載流插入運(yùn)算符和流提取運(yùn)算符重載流插入運(yùn)算符和流提取運(yùn)算符l對(duì)對(duì)“”重載的函數(shù)形式如下:重載的函數(shù)形式如下:Istream &

13、amp; operator(istream &,自定義類自定義類&)Ostream& operator(ostream &,自定義類自定義類&)l只能將重載只能將重載“” 的函數(shù)作為友元函的函數(shù)作為友元函數(shù)數(shù)3.7重載流插入運(yùn)算符和流提取運(yùn)算符重載流插入運(yùn)算符和流提取運(yùn)算符#include class Complex public: Complex()real=0;imag=0; Complex(double r,double i)real=r;imag=i; Complex operator + (Complex &c2); friend os

14、tream& operator (ostream&,Complex&); private: double real; double imag; ;Complex Complex:operator + (Complex &c2) return Complex(real+c2.real,imag+c2.imag); ostream& operator (ostream& output,Complex& c)output(c.real+c.imagi)endl; return output;int main()Complex c1(2,4),c

15、2(6,10),c3; c3=c1+c2; coutc3; return 0;3.7重載流插入運(yùn)算符和流提取運(yùn)算符重載流插入運(yùn)算符和流提取運(yùn)算符#include using namespace std;class Complex public: friend ostream& operator (istream&,Complex&); private: double real, imag; ostream& operator (ostream& output,Complex& c)output(c.real+c.imag (istream&

16、; input,Complex& c)coutc.realc.imag; return input;int main()Complex c1,c2; cinc1c2; coutc1=c1endl; coutc2=c2endl; return 0;3.8不同類型數(shù)據(jù)間的轉(zhuǎn)換不同類型數(shù)據(jù)間的轉(zhuǎn)換l標(biāo)準(zhǔn)類型數(shù)據(jù)間的轉(zhuǎn)換標(biāo)準(zhǔn)類型數(shù)據(jù)間的轉(zhuǎn)換(自動(dòng)轉(zhuǎn)換自動(dòng)轉(zhuǎn)換) 1.隱式轉(zhuǎn)換隱式轉(zhuǎn)換 int i=7.5+6; 2.顯式轉(zhuǎn)換顯式轉(zhuǎn)換 int(8.9)l用轉(zhuǎn)換構(gòu)造函數(shù)進(jìn)行類型轉(zhuǎn)換用轉(zhuǎn)換構(gòu)造函數(shù)進(jìn)行類型轉(zhuǎn)換 通常把有一個(gè)參數(shù)的構(gòu)造函數(shù)用作類型轉(zhuǎn)換,通常把有一個(gè)參數(shù)的構(gòu)造函數(shù)用作類型轉(zhuǎn)換,所以稱為轉(zhuǎn)換構(gòu)

17、造函數(shù)所以稱為轉(zhuǎn)換構(gòu)造函數(shù) 如:如:Complex(double)real=r;imag=0; Complex c=Complex(3.5);使用轉(zhuǎn)換構(gòu)造函數(shù)將一個(gè)指定的數(shù)據(jù)轉(zhuǎn)換為類對(duì)象的方法 1.先聲明一個(gè)類先聲明一個(gè)類 2.在這個(gè)類中定義一個(gè)只有一個(gè)參數(shù)的構(gòu)造函在這個(gè)類中定義一個(gè)只有一個(gè)參數(shù)的構(gòu)造函數(shù),參數(shù)的類型是需要轉(zhuǎn)換的類型數(shù),參數(shù)的類型是需要轉(zhuǎn)換的類型 3.在該類的作用域內(nèi)可以用在該類的作用域內(nèi)可以用 類名類名(指定類型的數(shù)據(jù)指定類型的數(shù)據(jù)) 進(jìn)行類型轉(zhuǎn)換進(jìn)行類型轉(zhuǎn)換用類型轉(zhuǎn)換函數(shù)進(jìn)行類型轉(zhuǎn)換用類型轉(zhuǎn)換函數(shù)進(jìn)行類型轉(zhuǎn)換l類型轉(zhuǎn)換函數(shù)的作用是將一個(gè)類的對(duì)象轉(zhuǎn)換成類型轉(zhuǎn)換函數(shù)的作用是將一

18、個(gè)類的對(duì)象轉(zhuǎn)換成另一類型的數(shù)據(jù)。形式如下:另一類型的數(shù)據(jù)。形式如下: operator 類型名類型名() 實(shí)現(xiàn)轉(zhuǎn)換語句實(shí)現(xiàn)轉(zhuǎn)換語句 /無函數(shù)類型、無參數(shù)無函數(shù)類型、無參數(shù) 示例示例1#include using namespace std;class Complex public: Complex()real=0;imag=0; Complex(double r,double i)real=r;imag=i; operator double() return real; private: double real; double imag; ; int main()Complex c1(3,4)

19、,c2(5,-10),c3; double d; d=2.5+c1; coutdendl; return 0;示例示例2#include using namespace std;class Complex public: Complex()real=0;imag=0; Complex(double r)real=r;imag=0; Complex(double r,double i)real=r;imag=i; friend Complex operator + (Complex c1,Complex c2); void display(); private: double real; dou

20、ble imag; ; Complex operator + (Complex c1,Complex c2) return Complex(c1.real+c2.real, c1.imag+c2.imag); void Complex:display()cout(real+imagi)”、“”和和“,”等運(yùn)算符,等運(yùn)算符,他們的重載有一些特殊之處,在此我們對(duì)運(yùn)算他們的重載有一些特殊之處,在此我們對(duì)運(yùn)算符符“”的重載加以介紹。在的重載加以介紹。在“”運(yùn)算符中的運(yùn)算符中的重載中用到的動(dòng)態(tài)內(nèi)存分配運(yùn)算重載中用到的動(dòng)態(tài)內(nèi)存分配運(yùn)算new,釋放內(nèi)釋放內(nèi)存分配運(yùn)算存分配運(yùn)算delete?!?”運(yùn)算符重載運(yùn)

21、算符重載“ ”是一個(gè)二元運(yùn)算符,其重載形式如下:是一個(gè)二元運(yùn)算符,其重載形式如下:class X T1& operator(T2 n) /T1,T2 為標(biāo)準(zhǔn)數(shù)據(jù)類型或已定義的類為標(biāo)準(zhǔn)數(shù)據(jù)類型或已定義的類類型類型;重載重載“ ”需要注意的問題:需要注意的問題: 是一個(gè)二元運(yùn)算符,其第是一個(gè)二元運(yùn)算符,其第1個(gè)參數(shù)是通過對(duì)象的個(gè)參數(shù)是通過對(duì)象的this指針傳遞的,指針傳遞的,第第2個(gè)參數(shù)代表數(shù)組的下標(biāo)。個(gè)參數(shù)代表數(shù)組的下標(biāo)。 由于由于 既可以出現(xiàn)在賦值符既可以出現(xiàn)在賦值符“=”的左邊,也可以出現(xiàn)在賦值符的左邊,也可以出現(xiàn)在賦值符“=”的右邊,所以重載運(yùn)算符的右邊,所以重載運(yùn)算符 時(shí)常返回引

22、用。時(shí)常返回引用。 只能被重載為類的非靜態(tài)成員函數(shù),不能被重載為友元和普通只能被重載為類的非靜態(tài)成員函數(shù),不能被重載為友元和普通函數(shù)。函數(shù)?!?”運(yùn)算符重載實(shí)例運(yùn)算符重載實(shí)例l設(shè)計(jì)一個(gè)工資管理類,它能根據(jù)職工的姓名錄設(shè)計(jì)一個(gè)工資管理類,它能根據(jù)職工的姓名錄入和查詢職工的工資,每個(gè)職工的基本數(shù)據(jù)有入和查詢職工的工資,每個(gè)職工的基本數(shù)據(jù)有職工姓名和工資。職工姓名和工資。l 定義結(jié)構(gòu)體定義結(jié)構(gòu)體Person#include #include using namespace std;struct Person /職工基本信息的結(jié)構(gòu) double salary; string name;l定義類定義類class SalaryManaege Person *employ; /存放職工信息的數(shù)組存放職工信息的數(shù)組int max; /數(shù)組下標(biāo)上界數(shù)組下標(biāo)上界int n; /數(shù)組中的實(shí)際職工人數(shù)數(shù)組中的實(shí)際職工人數(shù)public:SalaryManae

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論