付費下載
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1,第四章 運算符重載,2,第四章 運算符重載,4.1什么是運算符重載 4.2運算符重載的方法 4.3重載運算符的規(guī)則 4.4運算符重載函數(shù)作為類成員函數(shù)和友元函數(shù) 4.5重載雙目運算符 4.6重載單目運算符 4.7重載流插入運算符和流提取運算符 4.8 類和其他數(shù)據(jù)類型的轉(zhuǎn)換,3,4.1什么是運算符重載,C+ 為程序員提供了靈活的手段,讓程序員自己定義類,自己設(shè)計相應(yīng)的運算符(必須在已有的運算符基礎(chǔ)上設(shè)計),使之應(yīng)用于自己定義的類。與函數(shù)重載類似,對已有的運算符賦予新的含義,用一個運算符表示不同功能的運算,這就是運算符重載。 實際上,我們在此之前已經(jīng)使用了運算符重載。如是C+的移位運算符,它
2、又與流對象cout配合作為流插入運算符,這是C+對進行了重載處理。,4,運算符重載的實質(zhì),運算符重載是對已有的運算符賦予多重含義。 必要性:C+中預(yù)定義的運算符其運算對象只能是基本數(shù)據(jù)類型,而不適用于用戶自定義類型(如類) 實現(xiàn)機制 將指定的運算表達式轉(zhuǎn)化為對運算符函數(shù)的調(diào)用,運算對象轉(zhuǎn)化為運算符函數(shù)的實參。 編譯系統(tǒng)對重載運算符的選擇,遵循函數(shù)重載的選擇原則。,5,例4.1 通過成員函數(shù)實現(xiàn)復(fù)數(shù)的加法。 class Complex private: double real; double imag; public: Complex() real=0;imag=0; Complex(doubl
3、e r,double i) real=r; imag=i; Complex complex_add(Complex ,6,Complex Complex:complex_add(Complex ,int main() Complex c1(3,4),c2(5,-10); Complex c3; c3=plex_add(c2); coutc1=; c1.display(); coutc2=; c2.display(); coutc1+c2=; c3.display(); return 0; ,7,在Complex類中定義了complex_add函數(shù)做加法,函數(shù)的參數(shù)是引用對象,作為一個加數(shù)。在函
4、數(shù)里定義了臨時對象c,兩個賦值語句相當(dāng)于: c.real = this-real +c2.real; c.imag = this-imag+c2.image; 在main函數(shù)中通過對象c1調(diào)用加法函數(shù),上面的語句相當(dāng)于: c.real = c1.real +c2.real; c.imag = c1.imag+c2.image; 能否用+運算符實現(xiàn)復(fù)數(shù)加法?,8,4.2運算符重載的方法,運算符重載的方法是定義一個重載運算符函數(shù),在需要時系統(tǒng)自動調(diào)用該函數(shù),完成相應(yīng)的運算。運算符重載實質(zhì)上是函數(shù)的重載。運算符重載函數(shù)的格式是: 數(shù)據(jù)類型 operator 運算符(形參表) 重載處理 數(shù)據(jù)類型:是重
5、載函數(shù)值的數(shù)據(jù)類型。 operator 是保留字,9,規(guī)則和限制,C+中可以重載除下列運算符外的所有運算符:. .* : ?: 只能重載C+語言中已有的運算符,不可臆造新的。 不改變原運算符的優(yōu)先級和結(jié)合性。 不能改變操作數(shù)個數(shù)。 經(jīng)重載的運算符,其操作數(shù)中至少應(yīng)該有一個是的數(shù)據(jù)類型是類。,10,兩種形式,重載為類成員函數(shù)。 重載為友元函數(shù)。,11,運算符函數(shù),聲明形式 函數(shù)類型 operator 運算符(形參) . 重載為類成員函數(shù)時,類本身是一個操作操作數(shù),如果需要另一個操作數(shù)由函數(shù)的參數(shù)提供 重載為友元函數(shù)時 參數(shù)個數(shù)=原操作數(shù)個數(shù),且至少應(yīng)該有一個自定義的形參。,12,不能重載的運算符
6、只有5個: . 成員運算符 .* 成員指針運算符 : 域運算符 sizeof 長度運算符 ?: 條件運算符 重載函數(shù)名是由operator和運算符聯(lián)合組成。 復(fù)數(shù)加法運算符重載函數(shù)原型可以是: Complex operator+ (Complex 例4.2 重載運算符+,用于兩個復(fù)數(shù)相加。,13,分析: 定義一個復(fù)數(shù)類,用成員函數(shù)實現(xiàn)加號的重載函數(shù)。兩個復(fù)數(shù)相加結(jié)果仍是復(fù)數(shù),所以函數(shù)的返回值的類型也是復(fù)數(shù)類。用成員函數(shù)實現(xiàn)運算符重載函數(shù)時,調(diào)用格式是“對象名.成員名”,此時對象就是一個參與運算的操作數(shù),加法還需要另一個操作數(shù),這個操作數(shù)用函數(shù)的參數(shù)傳遞,參數(shù)的類型就是復(fù)數(shù)類。而運算結(jié)果用函數(shù)值
7、返回。,14,class Complex public: Complex() real=0; imag=0; Complex(double r,double i)real=r;imag=i; Complex operator + (Complex ,15,Complex Complex:operator + (Complex ,16,int main() Complex c1(3,4),c2(5,-10),c3; c3=c1+c2; coutc1=;c1.display(); coutc2=;c2.display(); coutc1+c2=;c3.display(); return 0; ,1
8、7,說明: (1)用運行符重載函數(shù)取代了例 4.1中的加法成員函數(shù),從外觀上看函數(shù)體和函數(shù)返回值都是相同的。 (2)在主函數(shù)中的表達式c3=c2+c1 取代了例4.1中的c3=plex_add(c2) ,編譯系統(tǒng)將表達式c3=c1+c2 解釋為 c1.operator + ( c2 ) 對象c1調(diào)用的重載函數(shù)operator + ,以c2為實參計算兩個復(fù)數(shù)之和。,18,請考慮在例4.2中能否用一個常量和一個復(fù)數(shù)相加?如 c3 = 3 + c2; / 錯誤 應(yīng)該定義對象:Complex C1(3.0,0) : c3 = C1 + c2; 注意:運算符重載后,其原來的功能仍然保留,編譯系統(tǒng)根據(jù)運算
9、表達式的上下文決定是否調(diào)用運算符重載函數(shù)。 運算符重載和類結(jié)合起來,可以在C+ 中定義使用方便的新數(shù)據(jù)類型。,19,4.3重載運算符的規(guī)則,(1)C+只允許已有的部分運算符實施重載。 (2)不能重載的運算符有五個。 (3)重載不改變操作數(shù)的個數(shù)。 (4)重載不改變運算符的優(yōu)先級。 (5)運算符重載函數(shù)不能帶默認值參數(shù)。 (6)運算符重載函數(shù)必須與自定義類型的對象聯(lián)合使用,其參數(shù)至少有一個類對象或類對象引用。 (7)C+默認提供 = 和 imag=0; Complex (double r) real=r;imag=0; Complex (double r,double i) real=r;ima
10、g=i; friend Complex operator+ (Complex ,23,Complex operator+ (Complex ,24,int main() Complex c1(3,4),c2(5,-10),c3; c3=c1+c2; coutc1=; c1.display(); coutc2=; c2.display(); coutc1+c2=; c3.display(); return 0; ,25,加法運算符重載為友元函數(shù),C+ 在編譯時將表達式c1+c2解釋為 operator + ( c1, c2) 即相當(dāng)于執(zhí)行以下函數(shù) Complex operator + ( Com
11、plex 因為普通函數(shù)是不能直接訪問對象的私有成員,如果普通函數(shù)必須訪問對象的私有成員,可調(diào)用類的公有成員函數(shù)訪問對象的私有成員。這會降低效率。,26,使用成員函數(shù)重載運算符要求左操作數(shù)必須是該類對象 如想將一個復(fù)數(shù)和一個整數(shù)相加,運算符重載函數(shù)作為成員函數(shù)定義如下: Complex Complex :operator + ( int 注意在運算符+的左側(cè)必須是Complex類對象,程序中可以寫成: c3 = c2 + n 不能寫成: c3 = n + c2,27,如果要求在使用重載運算符時,運算符左側(cè)操作數(shù)不是對象,就需要將運算符重載函數(shù)定義為友元函數(shù): friend Complex ope
12、rator + ( int 友元函數(shù)不要求第一個參數(shù)必須是類類型,但是要求實參要與形參一一對應(yīng): c3 = n + c2 / 順序正確 c3 = c2 +n / 順序錯誤,28,由于使用友元會破壞類的封裝,要盡量將運算符重載函數(shù)定義為成員函數(shù)。 除非有特殊需要,才使用友元函數(shù)重載運算符。,29,4.5重載雙目運算符,雙目的意思是運算符左邊和右邊的操作數(shù)均參加運算。 如果要重載 B 為類的成員函數(shù),使之能夠?qū)崿F(xiàn)表達式 oprd1 B oprd2,其中 oprd1 為A 類對象,則 B 應(yīng)被重載為 A 類的成員函數(shù),形參類型應(yīng)該是 oprd2 所屬的類型。 經(jīng)重載后,表達式 oprd1 B opr
13、d2 相當(dāng)于 oprd1.operator B(oprd2)。,30,例4.4 定義一個字符串類String,用來處理不定長的字符串,重載相等、大于、小于關(guān)系運算符,用于兩個字符串的等于、大于、小于的比較運算。 操作數(shù):兩個操作數(shù)都是字符串類的對象。 規(guī)則:兩個字符串進行比較。 將“”運算重載為字符串類的成員函數(shù)。,31,(1)先建立一個String類 #include #include class String / String 是用戶自己指定的類名 public: String() p=NULL; String( char *str ) ; void display(); private:
14、 char *p; ;,32,String:String(char *str) p=str; void String:display() coutp; int main() String string1(Hello),string2(Book); string1.display(); coutendl; string2.display(); return 0; ,33,先編寫出簡單的程序框架,編寫和調(diào)試都比較方便。構(gòu)造函數(shù)是把定義對象時的實參的地址賦予數(shù)據(jù)成員p,p是指向?qū)崊⒌闹羔槨3绦驅(qū)崿F(xiàn)了建立對象、輸出字符串對象的功能。程序運行結(jié)果分別輸出 Hello Book (2)有了這個基礎(chǔ)后,再增
15、加所需的其他內(nèi)容,先重載大于運算符。程序如下:,34,#include #include class String public: String () p=NULL; String (char *str); friend bool operator(String ,35,void String:display() cout(String ,36,運算符重載函數(shù)定義為友元函數(shù),函數(shù)值是布爾類型,在函數(shù)中調(diào)用了strcmp庫函數(shù),string1.p指向“Hello”,string2.p指向“Book”,程序運行結(jié)果是1。 (3)擴展到對另外三個運算符重載 在String類體中聲明三個重載函數(shù)是友元
16、函數(shù),并編寫相應(yīng)的函數(shù)。,37,#include #include class String public: String()p=NULL; String(char *str); friend bool operator (String ,38,String:String(char *str) p=str; void String:display() cout(String ,39,bool operator(String ,40,int main() String string1(Hello),string2(Book),string3(Computer); coutstring2)endl
17、; cout(string1string3)endl; cout(string1=string2)endl; return 0; 運行結(jié)果為 1 0 0,41,4.6重載單目運算符,單目運行符只要一個操作數(shù),由于只有一個操作數(shù),重載函數(shù)最多只有一個參數(shù),如果將運算符重載函數(shù)定義為成員函數(shù)還可以不用參數(shù)。 下面以自增運算符+為例,學(xué)習(xí)單目運算符的重載函數(shù)的編寫方法。 例4.5 有一個Time類,數(shù)據(jù)成員有時、分、秒。要求模擬秒表,每次走一秒,滿60秒進位,秒又從零開始計數(shù)。滿60分進位,分又從零開始計數(shù)。輸出時、分和秒的值。,42,#include using namespace std; cl
18、ass Time public: Time() hour=0;minute=0;sec=0; Time(int h,int m,int s):hour(h),minute(m),sec(s) Time operator+(); void display() couthour:minute:secendl; private: int hour; int minute; int sec; ;,43,Time Time:operator +()/前置單目運算符重載函數(shù) sec+; if(sec=60) sec=sec-60; minute+; if(minute=60) minute=minute-
19、60; hour+; hour=hour%24; return *this; ,43,44,int main() Time time1(23,59,0); for (int i=0;i61;i+) + time1; time1.display(); return 0; ,45,C+中除了有前+外,還有后+。同樣的運算符由于操作數(shù)的位置不同,含義也不同。 Time operator+(); 形式的運算符重載,既可以對應(yīng)前綴,也對應(yīng)后綴。 怎樣區(qū)分前+和后+? C+給了一個方法,在自增或自減運算符重載函數(shù)中,增加一個int 形參,此時成員函數(shù)表示后綴對應(yīng)的函數(shù)。 例4.6 在例4.5 的基礎(chǔ)上增加
20、后+運算符重載函數(shù)。,46,#include using namespace std; class Time public: Time()hour=0;minute=0;sec=0; Time(int h, int m,int s):hour(h),minute(m),sec(s) Time operator+(); Time operator+(int); void display()couthour:minute:secendl; private: int hour ; int minute; int sec; ;,47,Time Time : operator +()/前置單目運算符重載
21、函數(shù) sec+; if(sec=60) sec=sec-60; minute+; if(minute=60) minute=minute-60; hour+; hour=hour%24; return *this; ,47,48,分析:后+運算的含義是操作數(shù)先參加其他運算后再自加。如 m=n+ 先將n的值賦予m,然后n再自加1。設(shè)計后+重載函數(shù)要遵循這個特性。 Time Time:operator+(int) Time temp(*this); / 保存修改前的對象做返回值 +(*this); return temp; ,49,int main() Time time1(21,34,59),t
22、ime2; cout time1 : ; time1.display(); +time1; cout+time1: ; time1.display(); time2 = time1+; couttime1+: ; time1.display(); cout time2 : ; time2.display(); return 0; ,程序運行結(jié)果如下: Time1: 21:34:59 +Time1: 21:35:0 Time1+: 21:35:1 Time2: 21:35:0,50,4.7重載流插入運算符和流提取運算符,cin和cout分別是istream類和ostream類的對象。 C+已經(jīng)對
23、和 using namespace std;把頭文件包含到程序中。 用戶自定義類型的數(shù)據(jù)不能直接用輸出和輸入,如想用它們進行輸入或輸出,程序員必須對它們重載。,51,重載函數(shù)原型的格式如下: istream 從格式上看,重載函數(shù)和重載函數(shù)只能定義為友元函數(shù),不能定義為成員函數(shù),因為函數(shù)有兩個形參,并且第一個形參不是自定義類型。,52,4.7.1重載流插入運算符“”,例4.7 在例4.2的基礎(chǔ)上用重載函數(shù)輸出復(fù)數(shù)。 分析:在類中聲明重載函數(shù)是友元函數(shù) friend ostream ,53,#include int main() Complex c1(2,4),c2(6,10),c3; c3=c1
24、+c2; coutc3; return 0; ,54,分析C+怎樣處理”cout c3;” 運算符的左邊是ostream的對象cout,右邊是程序員自定義類complex的對象c3,語句符合運算符重載友元函數(shù)operator的形參類型要求,系統(tǒng)調(diào)用友元函數(shù),C+把這個語句解釋為: operator ( cout , c3); 通過形參引用傳遞,函數(shù)中的output就是cout,函數(shù)中的c就是c3,函數(shù)就變成: cout(c3.real+c3.imagi)endl; return cout; ,55,return cout 是將輸出流現(xiàn)狀返回。C+ 規(guī)定運算符重載函數(shù)第一個參數(shù)和函數(shù)的類型必須是
25、 ostream 類型的引用,目的是為了返回cout的當(dāng)前值,以便連續(xù)輸出。,56,4.7.2重載流提取運算符“”,例4.8 在例4.7 的基礎(chǔ)上增加流提取運算符重載函數(shù),用cin輸入復(fù)數(shù),用cout (istream ,57,int main() Complex c1,c2; cinc1c2; cout重載函數(shù)中的形參input是istream類對象引用,在執(zhí)行cinc1時,調(diào)用operator函數(shù),將cin引用傳遞給input,input是cin的別名,同樣c是c1的別名。因此,input c.real c.imag;相當(dāng)于cin c1.real c1.imag。函數(shù)返回cin的新值。使程序可以用重載函數(shù)連續(xù)從輸入流提取數(shù)據(jù)給complex類對象。,58,程序邏輯上是正確的,但還有缺陷,如果輸入的虛部是負數(shù)時,輸出的形式變成: c2 = ( 4+ - 10i ) 在負數(shù)前多個正號??梢詫Τ绦蛏宰鲂薷模?
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)員工行為規(guī)范制度
- 企業(yè)調(diào)休制度
- 交通擁堵監(jiān)測與評估制度
- 2026湖南海利高新技術(shù)產(chǎn)業(yè)集團有限公司國家危險化學(xué)品應(yīng)急救援湖南海利隊人員招聘31人備考題庫附答案
- 2026年及未來5年市場數(shù)據(jù)中國調(diào)味水產(chǎn)干制品行業(yè)發(fā)展全景監(jiān)測及投資前景展望報告
- 2026福建福州市閩江學(xué)院附屬中學(xué)招聘1人參考題庫附答案
- 2026西安高新區(qū)第九初級中學(xué)招聘教師考試備考題庫附答案
- 2026貴州黔東南州民族醫(yī)藥研究院招聘編外合同制醫(yī)師參考題庫附答案
- 2026重慶醫(yī)科大學(xué)附屬第一醫(yī)院人員(編制外)招聘4人備考題庫附答案
- 2026年及未來5年市場數(shù)據(jù)中國航空制造行業(yè)市場全景監(jiān)測及投資策略研究報告
- GB/T 33091-2016聚氨酯篩板
- 2023年電大當(dāng)代中國政治制度機考拼音排版絕對好用按字母排序
- GB 39669-2020牙刷及口腔器具安全通用技術(shù)要求
- 精益生產(chǎn)試題與答案
- 醫(yī)院關(guān)于主治醫(yī)師晉升前到急診科、重癥醫(yī)學(xué)科輪轉(zhuǎn)鍛煉工作的管理規(guī)定
- L1會計研究方法論簡介課件
- 防治水培訓(xùn)課件
- 按摩穴位保健養(yǎng)生課件
- 食材配送投標服務(wù)方案
- 大學(xué)生心理健康教育全套課件
- 《數(shù)據(jù)科學(xué)與大數(shù)據(jù)技術(shù)導(dǎo)論》完整版課件(全)
評論
0/150
提交評論