C暑期實(shí)踐課程第講課件_第1頁
C暑期實(shí)踐課程第講課件_第2頁
C暑期實(shí)踐課程第講課件_第3頁
C暑期實(shí)踐課程第講課件_第4頁
C暑期實(shí)踐課程第講課件_第5頁
已閱讀5頁,還剩33頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、2022/8/17Tsinghua University, lily12022/8/17Tsinghua University, lily1本講總體綱要第1部分: 多態(tài)性概念第2部分: 運(yùn)算符重載 第1頁,共38頁。2022/8/17Tsinghua University, lily22022/8/17Tsinghua University, lily2第1部分:多態(tài)性概念第2頁,共38頁。2022/8/17Tsinghua University, lily32022/8/17Tsinghua University, lily3綱要第1部分:多態(tài)性概念多態(tài)性的概念多態(tài)性的形式第3頁,共38頁。

2、2022/8/17Tsinghua University, lily44多態(tài)性的概念多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計的重要特征之一。多態(tài)從實(shí)現(xiàn)的角度來講可以劃分為兩類:編譯時的多態(tài)和運(yùn)行時的多態(tài)。前者是在編譯的過程中確定了同名操作的具體操作對象,而后者則是在程序運(yùn)行過程中才動態(tài)地確定操作所針對的具體對象。 第4頁,共38頁。2022/8/17Tsinghua University, lily55多態(tài)的形式常見形式函數(shù)重載運(yùn)算符重載虛函數(shù)第5頁,共38頁。2022/8/17Tsinghua University, lily62022/8/17Tsinghua University, lily6本講總體綱

3、要第1部分: 多態(tài)性概念第2部分: 運(yùn)算符重載第6頁,共38頁。2022/8/17Tsinghua University, lily72022/8/17Tsinghua University, lily7第2部分: 運(yùn)算符重載第7頁,共38頁。2022/8/17Tsinghua University, lily82022/8/17Tsinghua University, lily8綱要第2部分:運(yùn)算符重載為何需要重載運(yùn)算符?運(yùn)算符重載的實(shí)質(zhì)、形式以及規(guī)則和限制運(yùn)算符重載為類的成員函數(shù)運(yùn)算符重載為類的友元函數(shù)流運(yùn)算符重載第8頁,共38頁。2022/8/17Tsinghua University,

4、 lily99為何需要重載運(yùn)算符?C+把用戶定義的類和基本數(shù)據(jù)類型一樣看待。系統(tǒng)為基本數(shù)據(jù)定義了運(yùn)算符(如+-*/)。C+中預(yù)定義的運(yùn)算符其運(yùn)算對象只能是基本數(shù)據(jù)類型,而不適用于用戶自定義類型(如類)。允許用戶自定義的類類型定義這些運(yùn)算符。重新定義運(yùn)算符的運(yùn)算規(guī)則就稱為重載運(yùn)算符。運(yùn)算符重載能提高程序可讀性,但并不是必須的。運(yùn)算符重載看作類中提供的另一種形式的接口。第9頁,共38頁。2022/8/17Tsinghua University, lily1010問題舉例復(fù)數(shù)的運(yùn)算class complex/復(fù)數(shù)類聲明public:complex(double r=0.0,double i=0.0)

5、 /構(gòu)造函數(shù) real=r; imag=i; void display();/顯示復(fù)數(shù)的值 complex add(complex c2); /成員函數(shù)private:double real;double imag;第10頁,共38頁。2022/8/17Tsinghua University, lily1111complex complex:add(complex c2) complex c;c.real=c2.real+real;c.imag=c2.imag+imag;return complex(c.real,c.imag);int main() /主函數(shù) complex c1(5,4),

6、c2(2,10),c3; c3=c1.add(c2); return 0;第11頁,共38頁。2022/8/17Tsinghua University, lily1212問題舉例復(fù)數(shù)的運(yùn)算用“+”、“-”能夠?qū)崿F(xiàn)復(fù)數(shù)的加減運(yùn)算嗎? complex c1(5,4),c2(2,10),c3; c3=c1 + c2;實(shí)現(xiàn)復(fù)數(shù)加減運(yùn)算的方法 重載“+”、“-”運(yùn)算符第12頁,共38頁。2022/8/17Tsinghua University, lily1313complex complex: operator +(complex c2) complex c;c.real=c2.real+real;c.

7、imag=c2.imag+imag;return complex(c.real,c.imag);int main() /主函數(shù) complex c1(5,4),c2(2,10),c3; c3=c1+c2; /相當(dāng)于c1.operator+(c2) return 0;第13頁,共38頁。2022/8/17Tsinghua University, lily1414運(yùn)算符重載的實(shí)質(zhì)運(yùn)算符重載是對已有的運(yùn)算符賦予多重含義,實(shí)質(zhì)就是函數(shù)重載 。實(shí)現(xiàn)機(jī)制將指定的運(yùn)算表達(dá)式轉(zhuǎn)化為對運(yùn)算符函數(shù)的調(diào)用,運(yùn)算對象轉(zhuǎn)化為運(yùn)算符函數(shù)的實(shí)參。編譯系統(tǒng)對重載運(yùn)算符的選擇,遵循函數(shù)重載的選擇原則。(根據(jù)實(shí)參的類型來確定需要

8、調(diào)用的函數(shù))第14頁,共38頁。2022/8/17Tsinghua University, lily1515規(guī)則和限制可以重載C+中除下列運(yùn)算符外的所有運(yùn)算符:. .* : ?: sizeof 只能重載C+語言中已有的運(yùn)算符,不可臆造新的。不能改變操作數(shù)個數(shù)。不改變原運(yùn)算符的優(yōu)先級和結(jié)合性。經(jīng)重載的運(yùn)算符,其操作數(shù)中至少應(yīng)該有一個是自定義類型。第15頁,共38頁。2022/8/17Tsinghua University, lily1616兩種形式重載為類成員函數(shù)。重載為友元函數(shù)。第16頁,共38頁。2022/8/17Tsinghua University, lily1717運(yùn)算符函數(shù)聲明形式函

9、數(shù)類型 operator 運(yùn)算符(形參) .重載為類成員函數(shù)時 參數(shù)個數(shù)=原操作數(shù)個數(shù)-1(后置+、-除外)重載為友元函數(shù)時 參數(shù)個數(shù)=原操作數(shù)個數(shù),且至少應(yīng)該有一個自定義類型的形參。第17頁,共38頁。2022/8/17Tsinghua University, lily1818運(yùn)算符成員函數(shù)的設(shè)計前置單目運(yùn)算符 +和-如果要重載運(yùn)算符 +和-為類成員函數(shù),使之能夠?qū)崿F(xiàn)表達(dá)式 +a或 -a,其中 a 為A類對象,則 +或- 應(yīng)被重載為 A 類的成員函數(shù),無形參。經(jīng)重載后,表達(dá)式 +a相當(dāng)于 a.operator +( )第18頁,共38頁。2022/8/17Tsinghua Universit

10、y, lily1919運(yùn)算符成員函數(shù)的設(shè)計后置單目運(yùn)算符 +和-如果要重載 +或-為類成員函數(shù),使之能夠?qū)崿F(xiàn)表達(dá)式 a+ 或 a- ,其中 a 為A類對象,則 +或- 應(yīng)被重載為 A 類的成員函數(shù),且具有一個 int 類型形參。經(jīng)重載后,表達(dá)式 a+ 相當(dāng)于 a.operator +(0)第19頁,共38頁。2022/8/17Tsinghua University, lily2020運(yùn)算符成員函數(shù)舉例運(yùn)算符前置+和后置+重載為時鐘類的成員函數(shù)。前置單目運(yùn)算符,重載函數(shù)沒有形參,對于后置單目運(yùn)算符,重載函數(shù)需要有一個整型形參。操作數(shù)是時鐘類的對象。實(shí)現(xiàn)時間增加1秒鐘。第20頁,共38頁。2022

11、/8/17Tsinghua University, lily21#includeusing namespace std;class Clock/時鐘類聲明 public:/外部接口 Clock(int NewH=0, int NewM=0, int NewS=0); void ShowTime(); Clock& operator +(); /前置單目運(yùn)算符重載 Clock operator +(int); /后置單目運(yùn)算符重載 private:/私有數(shù)據(jù)成員 int Hour,Minute,Second;21第21頁,共38頁。2022/8/17Tsinghua University, li

12、ly22Clock& Clock:operator +()/前置單目運(yùn)算符重載函數(shù)Second+;if(Second=60) Second=Second-60; Minute+; if(Minute=60) Minute=Minute-60; Hour+; Hour=Hour%24; return *this;22第22頁,共38頁。2022/8/17Tsinghua University, lily23/后置單目運(yùn)算符重載Clock Clock:operator +(int)/注意形參表中的整型參數(shù) Clock old(*this); +(*this); return old;23后置運(yùn)算符

13、運(yùn)算結(jié)果是操作數(shù)變化前的值,所以編譯器須先將操作數(shù)的原始值存放在一個臨時單元中。后置運(yùn)算符最容易滋生副作用。第23頁,共38頁。2022/8/17Tsinghua University, lily24/其它成員函數(shù)的實(shí)現(xiàn)略int main()Clock myClock(23,59,59);coutFirst time output:;myClock.ShowTime(); coutShow myClock+:; (myClock+).ShowTime(); coutShow +myClock:;(+myClock).ShowTime();24第24頁,共38頁。2022/8/17Tsinghu

14、a University, lily2525運(yùn)算符友元函數(shù)的設(shè)計如果需要重載一個運(yùn)算符,使之能夠用于操作某類對象的私有成員,可以此將運(yùn)算符重載為該類的友元函數(shù)。函數(shù)的形參代表依自左至右次序排列的各操作數(shù)。后置單目運(yùn)算符 +和-的重載函數(shù),形參列表中要增加一個int,但不必寫形參名。第25頁,共38頁。2022/8/17Tsinghua University, lily2626運(yùn)算符友元函數(shù)的設(shè)計雙目運(yùn)算符 B重載后,表達(dá)式oprd1 B oprd2 等同于operator B(oprd1,oprd2 )前置單目運(yùn)算符 B重載后,表達(dá)式 B oprd 等同于operator B(oprd )后置

15、單目運(yùn)算符 +和-重載后,表達(dá)式 oprd B 等同于operator B(oprd,0 )第26頁,共38頁。2022/8/17Tsinghua University, lily2727運(yùn)算符友元函數(shù)舉例將+、-(雙目)重載為復(fù)數(shù)類的友元函數(shù)。兩個操作數(shù)都是復(fù)數(shù)類的對象。第27頁,共38頁。2022/8/17Tsinghua University, lily28#includeusing namespace std;class complex/復(fù)數(shù)類聲明public:/外部接口complex(double r=0.0,double i=0.0) real=r; imag=i; /構(gòu)造函數(shù)fr

16、iend complex operator + (complex c1,complex c2);/運(yùn)算符+重載為友元函數(shù)friend complex operator - (complex c1,complex c2);/運(yùn)算符-重載為友元函數(shù)void display();/顯示復(fù)數(shù)的值private:/私有數(shù)據(jù)成員double real;double imag;28第28頁,共38頁。2022/8/17Tsinghua University, lily29complex operator +(complex c1,complex c2)/運(yùn)算符重載友元函數(shù)實(shí)現(xiàn) return complex(

17、c2.real+c1.real, c2.imag+c1.imag);complex operator -(complex c1,complex c2)/運(yùn)算符重載友元函數(shù)實(shí)現(xiàn)return complex(c1.real-c2.real, c1.imag-c2.imag);29第29頁,共38頁。2022/8/17Tsinghua University, lily3030流運(yùn)算符應(yīng)該重載為友元函數(shù) 流運(yùn)算符的左操作數(shù)應(yīng)為流對象。如果一個重載的運(yùn)算符是一個成員函數(shù),那么它的左操作數(shù)是*this,它是類的一個對象,而函數(shù)是類的成員。 第30頁,共38頁。2022/8/17Tsinghua Unive

18、rsity, lily3131值返回與引用返回運(yùn)算符重載的返回值一般都是類的對象,但為何有的是值返回,有的是引用返回。如果返回的是一個臨時對象,就必須采用值返回,而不能采用引用返回。如果返回值希望再作為左值,就應(yīng)該采用引用返回,而不是值返回。第31頁,共38頁。2022/8/17Tsinghua University, lily3232#includeusing namespace std;class RMBpublic:RMB(unsigned int d,unsigned int c);RMB operator +(RMB&); RMB& operator +();RMB operator

19、 +(int);void display();friend ostream& operator =100)yuan+;jf-=100; RMB RMB:operator +(RMB& s)unsigned int jf1 = jf + s.jf;unsigned yuan1 = yuan + s.yuan;RMB result(yuan1,jf1);return result; RMB& RMB:operator +() jf+;if (jf =100)jf-=100;yuan+;return *this;第33頁,共38頁。2022/8/17Tsinghua University, lily

20、3434RMB RMB:operator +(int)RMB temp(*this);+(*this);return temp; void RMB:display()cout (yuan + jf/100.0)endl; ostream & operator (ostream & os,const RMB &r)os (r.yuan + r.jf/100.0); osr.yuan“元”r.jf“分”endl;return os;第34頁,共38頁。2022/8/17Tsinghua University, lily3535int main()RMB d1(1,60);RMB d2(2,50);

21、RMB d3(0,0);d3= d1 + d2;d3.display();(+d3).display();+(+d3);+(+(+d3);d3.display();(d3+).display();(d3+)+);(d3+)+)+);d3.display(); coutd3;return 0;第35頁,共38頁。2022/8/17Tsinghua University, lily362022/8/17Tsinghua University, lily36作業(yè)1. 已知一個有理數(shù)類zrf_Ratio,包含私有數(shù)據(jù)成員:分子num和分母den, 以及公有函數(shù)成員 friend ostream& operator(ostream& ostr, const zrf_Ratio& r) return ostr r.num / r.den; 請補(bǔ)充該類的構(gòu)造函數(shù),并實(shí)現(xiàn)如下的操作符重載形式: friend zrf_Ratio operator-(const zrf_Ratio&); friend zrf_Ratio operator+(const zrf_Ratio&, const zrf_Ratio&); friend zrf_Ratio operator-(const zrf_Ratio&, const zrf_Ratio&); friend zrf_Ratio operator*

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論