




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
會計學1C暑期實踐課程第講實用2023/1/1722023/1/17TsinghuaUniversity,lily2第1部分: 多態(tài)性概念第1頁/共38頁2023/1/1732023/1/17TsinghuaUniversity,lily3綱要——第1部分:多態(tài)性概念多態(tài)性的概念多態(tài)性的形式第2頁/共38頁2023/1/1744多態(tài)性的概念多態(tài)性是面向?qū)ο蟪绦蛟O計的重要特征之一。多態(tài)從實現(xiàn)的角度來講可以劃分為兩類:編譯時的多態(tài)和運行時的多態(tài)。前者是在編譯的過程中確定了同名操作的具體操作對象,而后者則是在程序運行過程中才動態(tài)地確定操作所針對的具體對象。第3頁/共38頁2023/1/1755多態(tài)的形式常見形式函數(shù)重載運算符重載虛函數(shù)第4頁/共38頁2023/1/1762023/1/17TsinghuaUniversity,lily6本講總體綱要第1部分:多態(tài)性概念第2部分:運算符重載第5頁/共38頁2023/1/1772023/1/17TsinghuaUniversity,lily7第2部分:運算符重載第6頁/共38頁2023/1/1782023/1/17TsinghuaUniversity,lily8綱要——第2部分:
運算符重載為何需要重載運算符?運算符重載的實質(zhì)、形式以及規(guī)則和限制運算符重載為類的成員函數(shù)運算符重載為類的友元函數(shù)流運算符重載第7頁/共38頁2023/1/1799為何需要重載運算符?C++把用戶定義的類和基本數(shù)據(jù)類型一樣看待。系統(tǒng)為基本數(shù)據(jù)定義了運算符(如+-*/)。C++中預定義的運算符其運算對象只能是基本數(shù)據(jù)類型,而不適用于用戶自定義類型(如類)。允許用戶自定義的類類型定義這些運算符。重新定義運算符的運算規(guī)則就稱為重載運算符。運算符重載能提高程序可讀性,但并不是必須的。運算符重載看作類中提供的另一種形式的接口。第8頁/共38頁2023/1/171010問題舉例——復數(shù)的運算classcomplex //復數(shù)類聲明{public: complex(doubler=0.0,doublei=0.0)//構(gòu)造函數(shù)
{real=r;imag=i;} voiddisplay(); //顯示復數(shù)的值
complexadd(complexc2);//成員函數(shù)private: doublereal; doubleimag;}; 第9頁/共38頁2023/1/171111complexcomplex::add(complexc2){ complexc; c.real=c2.real+real; c.imag=c2.imag+imag; returncomplex(c.real,c.imag);}intmain()//主函數(shù){ complexc1(5,4),c2(2,10),c3;
c3=c1.add(c2);return0;}第10頁/共38頁2023/1/171212問題舉例——復數(shù)的運算用“+”、“-”能夠?qū)崿F(xiàn)復數(shù)的加減運算嗎?
complexc1(5,4),c2(2,10),c3;
c3=c1+c2;實現(xiàn)復數(shù)加減運算的方法
——重載“+”、“-”運算符第11頁/共38頁2023/1/171313complexcomplex::operator+(complexc2){ complexc; c.real=c2.real+real; c.imag=c2.imag+imag; returncomplex(c.real,c.imag);}intmain()//主函數(shù){ complexc1(5,4),c2(2,10),c3;
c3=c1+c2;//相當于c1.operator+(c2)return0;}第12頁/共38頁2023/1/171414運算符重載的實質(zhì)運算符重載是對已有的運算符賦予多重含義,實質(zhì)就是函數(shù)重載。實現(xiàn)機制將指定的運算表達式轉(zhuǎn)化為對運算符函數(shù)的調(diào)用,運算對象轉(zhuǎn)化為運算符函數(shù)的實參。編譯系統(tǒng)對重載運算符的選擇,遵循函數(shù)重載的選擇原則。(根據(jù)實參的類型來確定需要調(diào)用的函數(shù))第13頁/共38頁2023/1/171515規(guī)則和限制可以重載C++中除下列運算符外的所有運算符:
..*::?:sizeof只能重載C++語言中已有的運算符,不可臆造新的。不能改變操作數(shù)個數(shù)。不改變原運算符的優(yōu)先級和結(jié)合性。經(jīng)重載的運算符,其操作數(shù)中至少應該有一個是自定義類型。第14頁/共38頁2023/1/171616兩種形式重載為類成員函數(shù)。重載為友元函數(shù)。第15頁/共38頁2023/1/171717運算符函數(shù)聲明形式函數(shù)類型operator運算符(形參){......}重載為類成員函數(shù)時
參數(shù)個數(shù)=原操作數(shù)個數(shù)-1 (后置++、--除外)重載為友元函數(shù)時參數(shù)個數(shù)=原操作數(shù)個數(shù),且至少應該有一個自定義類型的形參。第16頁/共38頁2023/1/171818運算符成員函數(shù)的設計前置單目運算符++和--如果要重載運算符++和--為類成員函數(shù),使之能夠?qū)崿F(xiàn)表達式++a或--a,其中
a為A類對象,則++或--應被重載為A類的成員函數(shù),無形參。經(jīng)重載后,
表達式
++a相當于a.operator++()第17頁/共38頁2023/1/171919運算符成員函數(shù)的設計后置單目運算符++和--如果要重載++或--為類成員函數(shù),使之能夠?qū)崿F(xiàn)表達式
a++
或a--
,其中
a為A類對象,則++或--應被重載為A類的成員函數(shù),且具有一個int類型形參。經(jīng)重載后,表達式
a++
相當于a.operator++(0)第18頁/共38頁2023/1/172020運算符成員函數(shù)舉例運算符前置++和后置++重載為時鐘類的成員函數(shù)。前置單目運算符,重載函數(shù)沒有形參,對于后置單目運算符,重載函數(shù)需要有一個整型形參。操作數(shù)是時鐘類的對象。實現(xiàn)時間增加1秒鐘。第19頁/共38頁2023/1/1721#include<iostream>usingnamespacestd;classClock //時鐘類聲明{public: //外部接口
Clock(intNewH=0,intNewM=0,intNewS=0); voidShowTime();
Clock&operator++();//前置單目運算符重載
Clockoperator++(int);//后置單目運算符重載
private: //私有數(shù)據(jù)成員
intHour,Minute,Second;};21第20頁/共38頁2023/1/1722Clock&Clock::operator++() //前置單目運算符重載函數(shù){ Second++; if(Second>=60) {Second=Second-60; Minute++; if(Minute>=60) { Minute=Minute-60; Hour++; Hour=Hour%24; } }
return*this;}22第21頁/共38頁2023/1/1723//后置單目運算符重載ClockClock::operator++(int) { //注意形參表中的整型參數(shù)
Clockold(*this);++(*this);
returnold;}23后置運算符運算結(jié)果是操作數(shù)變化前的值,所以編譯器須先將操作數(shù)的原始值存放在一個臨時單元中。后置運算符最容易滋生副作用。第22頁/共38頁2023/1/1724//其它成員函數(shù)的實現(xiàn)略intmain(){ ClockmyClock(23,59,59); cout<<"Firsttimeoutput:"; myClock.ShowTime();cout<<"ShowmyClock++:";(myClock++).ShowTime();cout<<"Show++myClock:"; (++myClock).ShowTime();}24第23頁/共38頁2023/1/172525運算符友元函數(shù)的設計如果需要重載一個運算符,使之能夠用于操作某類對象的私有成員,可以此將運算符重載為該類的友元函數(shù)。函數(shù)的形參代表依自左至右次序排列的各操作數(shù)。后置單目運算符++和--的重載函數(shù),形參列表中要增加一個int,但不必寫形參名。第24頁/共38頁2023/1/172626運算符友元函數(shù)的設計雙目運算符B重載后,
表達式oprd1Boprd2
等同于operatorB(oprd1,oprd2)前置單目運算符B重載后,
表達式Boprd
等同于operatorB(oprd)后置單目運算符++和--重載后,
表達式oprdB
等同于operatorB(oprd,0)第25頁/共38頁2023/1/172727運算符友元函數(shù)舉例將+、-(雙目)重載為復數(shù)類的友元函數(shù)。兩個操作數(shù)都是復數(shù)類的對象。第26頁/共38頁2023/1/1728#include<iostream>usingnamespacestd;classcomplex //復數(shù)類聲明{public: //外部接口
complex(doubler=0.0,doublei=0.0)
{real=r;imag=i;} //構(gòu)造函數(shù)
friendcomplexoperator+(complexc1,complexc2); //運算符+重載為友元函數(shù)
friendcomplexoperator-(complexc1,complexc2); //運算符-重載為友元函數(shù)
voiddisplay(); //顯示復數(shù)的值private: //私有數(shù)據(jù)成員
doublereal; doubleimag;}; 28第27頁/共38頁2023/1/1729complexoperator+(complexc1,complexc2) //運算符重載友元函數(shù)實現(xiàn){ return
complex(c2.real+c1.real,c2.imag+c1.imag);}complexoperator-(complexc1,complexc2) //運算符重載友元函數(shù)實現(xiàn){ return
complex(c1.real-c2.real,c1.imag-c2.imag);}29第28頁/共38頁2023/1/173030流運算符<<和>>應該重載為友元函數(shù)流運算符的左操作數(shù)應為流對象。如果一個重載的運算符是一個成員函數(shù),那么它的左操作數(shù)是*this,它是類的一個對象,而函數(shù)是類的成員。
第29頁/共38頁2023/1/173131值返回與引用返回運算符重載的返回值一般都是類的對象,但為何有的是值返回,有的是引用返回。如果返回的是一個臨時對象,就必須采用值返回,而不能采用引用返回。如果返回值希望再作為左值,就應該采用引用返回,而不是值返回。第30頁/共38頁2023/1/173232#include<iostream>usingnamespacestd;classRMB{public: RMB(unsignedintd,unsignedintc); RMBoperator+(RMB&);
RMB&operator++();
RMBoperator++(int); voiddisplay();
friendostream&operator<<(ostream&os,constRMB&r);private: unsignedintyuan; unsignedintjf;};第31頁/共38頁2023/1/173333RMB::RMB(unsignedintd,unsignedintc){ yuan=d;jf=c; while(jf>=100) { yuan++;jf-=100;}}RMBRMB::operator+(RMB&s) { unsignedintjf1=jf+s.jf; unsignedyuan1=yuan+s.yuan; RMBresult(yuan1,jf1); returnresult;}
RMB&RMB::operator++() {jf++; if(jf>=100) { jf-=100;yuan++;}
return*this;}第32頁/共38頁2023/1/173434
RMBRMB::operator++(int) {
RMBtemp(*this); ++(*this);
returntemp; }voidRMB::display() { cout<<(yuan+jf/100.0)<<endl; }
ostream&operator<<(ostream&os,constRMB&r) { os<<(r.yuan+r.jf/100.0);os<<r.yuan<<“元”<<r.jf<<“分”<<endl; returnos; }第33頁/共38頁2023/1/173535intmain() { RMBd1(1,60); RMBd2(2,50); RMBd3(0,0); d3=d1+d2; d3.display(); (++d3).display(); ++(++d3); ++(++(++d3)); d3.display(); (d3++).display(); ((d3++)++); (((d3++)++)++); d3.display(); cout<<d3; return0; }第34頁/共38頁2023/1/17362023/1/17TsinghuaUniversity,lily36作業(yè)1.已知一個有理數(shù)類zrf_Ratio,包含私有數(shù)據(jù)成員:分子num和分母den,以及公有函數(shù)成員
friendostream&operator<<(ostream&ostr,constzrf_Ratio&r){returnostr<<r.num<<"/"<<r.den;}
請補充該類的構(gòu)造函數(shù),并實現(xiàn)如下的操作符重載形式:
friendzrf_Ratiooperator-(constzrf_Ratio&);friendzrf_Ratiooperator+(constzrf_Ratio&,constzrf_Ratio&);friendzrf_Ratiooperator-(constzrf_Ratio&,constzrf_Ratio&);friendzrf_Ratiooperator*(constzrf_
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 渝北石紋地板施工方案
- 碑林區(qū)高一聯(lián)考數(shù)學試卷
- 鼓樓區(qū)樓道出新施工方案
- 電廠排灰委托運行施工方案
- 樓梯間踢腳線粉墻施工方案
- 2025年大數(shù)據(jù)展現(xiàn)平臺合作協(xié)議書
- 數(shù)控加工工藝與編程技術(shù)基礎 教案 模塊二 項目二 綜合件的加工(3-4)
- 加強農(nóng)田基礎設施建設實施方案
- 揮發(fā)性有機物排放控制的法律法規(guī)及政策要求
- 強化基本醫(yī)療衛(wèi)生服務的策略及實施路徑
- 重慶危險性較大的分部分項工程安全管理實施細則
- 三菱 PLC FX2N-4AD 4DA 模擬量模塊教材(課堂PPT)
- 有機金屬化學1
- JIT標準作業(yè)作業(yè)指導書
- 土壤固化土施工技術(shù)導則
- VAR模型Johansen協(xié)整檢驗在eviews中的具體操作步驟及結(jié)果解釋
- 混凝土面板堆石壩接縫止水
- 加油站法律法規(guī)符合性評價
- 5外科--丹毒下肢丹毒中醫(yī)診療方案2017年版
- 錨索錨桿計算表格(含下滑力及錨桿錨索受力及伸長值計算)
- 數(shù)學物理方法第十一章PPT課件
評論
0/150
提交評論