C暑期实践课程第讲实用实用教案

上传人:公**** 文档编号:569522895 上传时间:2024-07-30 格式:PPT 页数:39 大小:822KB
返回 下载 相关 举报
C暑期实践课程第讲实用实用教案_第1页
第1页 / 共39页
C暑期实践课程第讲实用实用教案_第2页
第2页 / 共39页
C暑期实践课程第讲实用实用教案_第3页
第3页 / 共39页
C暑期实践课程第讲实用实用教案_第4页
第4页 / 共39页
C暑期实践课程第讲实用实用教案_第5页
第5页 / 共39页
点击查看更多>>
资源描述

《C暑期实践课程第讲实用实用教案》由会员分享,可在线阅读,更多相关《C暑期实践课程第讲实用实用教案(39页珍藏版)》请在金锄头文库上搜索。

1、2024/7/3012024/7/30Tsinghua University, lily1第1部分(bfen): 多态性概念第1页/共38页第一页,共39页。2024/7/3022024/7/30Tsinghua University, lily2纲要第1部分(bfen):多态性概念多态性的概念多态性的概念(ginin)(ginin)多态性的形式多态性的形式第2页/共38页第二页,共39页。2024/7/3033多态性的概念(ginin)多态性是面向对象(duxing)程序设计的重要特征之一。多态从实现的角度来讲可以划分为两类:编译时的多态和运行时的多态。前者是在编译的过程中确定了同名操作的具

2、体操作对象(duxing),而后者则是在程序运行过程中才动态地确定操作所针对的具体对象(duxing)。第3页/共38页第三页,共39页。2024/7/3044多态的形式(xngsh)常见形式(xngsh)函数重载运算符重载虚函数第4页/共38页第四页,共39页。2024/7/3052024/7/30Tsinghua University, lily5本讲总体(zngt)纲要第1部分:多态性概念(ginin)第2部分:运算符重载第5页/共38页第五页,共39页。2024/7/3062024/7/30Tsinghua University, lily6第2部分(bfen):运算符重载第6页/共3

3、8页第六页,共39页。2024/7/3072024/7/30Tsinghua University, lily7纲要第2部分(bfen):运算符重载为何需要重载运算符?为何需要重载运算符?运算符重载的实质、形式以及规则运算符重载的实质、形式以及规则(guz)(guz)和限制和限制运算符重载为类的成员函数运算符重载为类的成员函数运算符重载为类的友元函数运算符重载为类的友元函数流运算符重载流运算符重载第7页/共38页第七页,共39页。2024/7/3088为何(wih)需要重载运算符?C+把用户定义的类和基本数据类型一样看待。系统为基本数据定义了运算符(如+-*/)。C+中预定义的运算符其运算对象

4、只能是基本数据类型,而不适用于用户自定义类型(如类)。允许用户自定义的类类型定义这些运算符。重新定义运算符的运算规则就称为重载运算符。运算符重载能提高程序可读性,但并不是必须的。运算符重载看作类中提供的另一种(yzhn)形式的接口。第8页/共38页第八页,共39页。2024/7/3099问题举例(jl)复数的运算classcomplex/复数类声明public:complex(doubler=0.0,doublei=0.0)/构造函数real=r;imag=i;voiddisplay();/显示复数的值complexadd(complexc2);/成员(chngyun)函数private:do

5、ublereal;doubleimag;第9页/共38页第九页,共39页。2024/7/301010complex complex:add(complex c2) complex c;c.real=c2.real+real;c.imag=c2.imag+imag;return complex(c.real,c.imag);int main() /主函数(hnsh) complex c1(5,4),c2(2,10),c3; c3=c1.add(c2); return 0;第10页/共38页第十页,共39页。2024/7/301111问题举例复数(fsh)的运算用“+”、“-”能够实现复数的加减运

6、算(ynsun)吗?complexc1(5,4),c2(2,10),c3;c3=c1+c2;实现复数加减运算(ynsun)的方法重载“+”、“-”运算(ynsun)符第11页/共38页第十一页,共39页。2024/7/301212complex complex: operator +(complex c2) complex c;c.real=c2.real+real;c.imag=c2.imag+imag;return complex(c.real,c.imag);int main() /主函数(hnsh) complex c1(5,4),c2(2,10),c3; c3=c1+c2; /相当于

7、c1.operator+(c2) return 0;第12页/共38页第十二页,共39页。2024/7/301313运算符重载(zhnzi)的实质运算符重载是对已有的运算符赋予多重含义(hny),实质就是函数重载。实现机制将指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参。编译系统对重载运算符的选择,遵循函数重载的选择原则。(根据实参的类型来确定需要调用的函数)第13页/共38页第十三页,共39页。2024/7/301414规则(guz)和限制可以重载C+中除下列(xili)运算符外的所有运算符:.*:?:sizeof只能重载C+语言中已有的运算符,不可臆造新的。不能改

8、变操作数个数。不改变原运算符的优先级和结合性。经重载的运算符,其操作数中至少应该有一个是自定义类型。第14页/共38页第十四页,共39页。2024/7/301515两种形式(xngsh)重载(zhnzi)为类成员函数。重载(zhnzi)为友元函数。第15页/共38页第十五页,共39页。2024/7/301616运算符函数(hnsh)声明形式(xngsh)函数类型operator运算符(形参).重载为类成员函数时参数个数=原操作数个数-1(后置+、-除外)重载为友元函数时参数个数=原操作数个数,且至少应该有一个自定义类型的形参。第16页/共38页第十六页,共39页。2024/7/301717运算

9、符成员函数(hnsh)的设计前置单目运算符+和-如果要重载运算符+和-为类成员函数,使之能够实现表达式+a或-a,其中a为A类对象(duxing),则+或-应被重载为A类的成员函数,无形参。经重载后,表达式+a相当于a.operator+()第17页/共38页第十七页,共39页。2024/7/301818运算符成员(chngyun)函数的设计后置单目运算符+和-如果要重载+或-为类成员函数,使之能够实现表达式a+或a-,其中a为A类对象,则+或-应被重载为A类的成员函数,且具有( jyu)一个int类型形参。经重载后,表达式a+相当于a.operator+(0)第18页/共38页第十八页,共3

10、9页。2024/7/301919运算符成员函数运算符成员函数(hnsh)(hnsh)举例举例运算符前置+和后置+重载为时钟类的成员(chngyun)函数。前置单目运算符,重载函数没有形参,对于后置单目运算符,重载函数需要有一个整型形参。操作数是时钟类的对象。实现时间增加1秒钟。第19页/共38页第十九页,共39页。2024/7/3020#includeusingnamespacestd;classClock/时钟类声明(shngmng)public:/外部接口Clock(int NewH=0, int NewM=0, intNewS=0);voidShowTime();Clock&operat

11、or+();/前置单目运算符重载Clockoperator+(int);/后置单目运算符重载private:/私有数据成员intHour,Minute,Second;20第20页/共38页第二十页,共39页。2024/7/3021Clock&Clock:operator+()/前置(qinzh)单目运算符重载函数 Second+;if(Second=60)Second=Second-60;Minute+;if(Minute=60)Minute=Minute-60;Hour+;Hour=Hour%24;return*this;21第21页/共38页第二十一页,共39页。2024/7/3022/后

12、置(huzh)单目运算符重载ClockClock:operator+(int)/注意形参表中的整型参数Clockold(*this);+(*this);returnold;22后置(hu zh)运算符运算结果是操作数变化前的值,所以编译器须先将操作数的原始值存放在一个临时单元中。后置(hu zh)运算符最容易滋生副作用。第22页/共38页第二十二页,共39页。2024/7/3023/其它(qt)成员函数的实现略intmain()ClockmyClock(23,59,59);coutFirsttimeoutput:;myClock.ShowTime();coutShowmyClock+:;(my

13、Clock+).ShowTime();coutShow+myClock:;(+myClock).ShowTime();23第23页/共38页第二十三页,共39页。2024/7/302424运算符友元函数(hnsh)的设计如果需要(xyo)重载一个运算符,使之能够用于操作某类对象的私有成员,可以此将运算符重载为该类的友元函数。函数的形参代表依自左至右次序排列的各操作数。后置单目运算符+和-的重载函数,形参列表中要增加一个int,但不必写形参名。第24页/共38页第二十四页,共39页。2024/7/302525运算符友元函数(hnsh)的设计双目运算符B重载(zhnzi)后,表达式oprd1Bop

14、rd2等同于operatorB(oprd1,oprd2)前置单目运算符B重载(zhnzi)后,表达式Boprd等同于operatorB(oprd)后置单目运算符+和-重载(zhnzi)后,表达式oprdB等同于operatorB(oprd,0)第25页/共38页第二十五页,共39页。2024/7/302626运算符友元函数(hnsh)举例将+、-(双目)重载为复数类的友元函数。两个(lin )操作数都是复数类的对象。第26页/共38页第二十六页,共39页。2024/7/3027#includeusingnamespacestd;classcomplex/复数类声明public:/外部接口com

15、plex(doubler=0.0,doublei=0.0)real=r;imag=i;/构造函数friendcomplexoperator+(complexc1,complexc2);/运算符+重载为友元函数friendcomplexoperator-(complexc1,complexc2);/运算符-重载为友元函数voiddisplay();/显示复数的值private:/私有(syu)数据成员doublereal;doubleimag;27第27页/共38页第二十七页,共39页。2024/7/3028complexoperator+(complexc1,complexc2)/运算符重载友

16、元函数(hnsh)实现 returncomplex(c2.real+c1.real,c2.imag+c1.imag);complexoperator-(complexc1,complexc2)/运算符重载友元函数(hnsh)实现 returncomplex(c1.real-c2.real,c1.imag-c2.imag);28第28页/共38页第二十八页,共39页。2024/7/302929流运算符应该重载(zhn (zhn zi)zi)为友元函数 流运算符的左操作数应为流对象(duxing)。如果一个重载的运算符是一个成员函数,那么它的左操作数是*this,它是类的一个对象(duxing),

17、而函数是类的成员。 第29页/共38页第二十九页,共39页。2024/7/303030值返回(fnhu)与引用返回(fnhu)运算符重载的返回值一般都是类的对象,但为何有的是值返回,有的是引用返回。如果返回的是一个临时对象,就必须采用值返回,而不能采用引用返回。如果返回值希望再作为左值,就应该(ynggi)采用引用返回,而不是值返回。第30页/共38页第三十页,共39页。2024/7/303131#includeusing namespace std;class RMBpublic:RMB(unsigned int d,unsigned int c);RMB operator +(RMB&);

18、 RMB& operator +();RMB operator +(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;第32页/共38页第三十二

19、页,共39页。2024/7/303333RMBRMB: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);osr.yuan“元”r.jf“分”endl;returnos;第33页/共38页第三十三页,共39页。2024/7/303434intmain()RMBd1(1,60);RMBd2(2,50);RMBd3(0,0);d3=d1+d2;d3.d

20、isplay();(+d3).display();+(+d3);+(+(+d3);d3.display();(d3+).display();(d3+)+);(d3+)+)+);d3.display();coutd3;return0;第34页/共38页第三十四页,共39页。2024/7/30352024/7/30Tsinghua University, lily35作业(zuy)1.已知一个有理数类zrf_Ratio,包含私有(syu)数据成员:分子num和分母den,以及公有函数成员friendostream&operator(ostream&ostr,constzrf_Ratio&r)ret

21、urnostrr.num/r.den;请补充该类的构造函数,并实现如下的操作符重载形式:friendzrf_Ratiooperator-(constzrf_Ratio&);friendzrf_Ratiooperator+(constzrf_Ratio&,constzrf_Ratio&);friendzrf_Ratiooperator-(constzrf_Ratio&,constzrf_Ratio&);friendzrf_Ratiooperator*(constzrf_Ratio&,constzrf_Ratio&);friendzrf_Ratiooperator/(constzrf_Ratio&

22、,constzrf_Ratio&);2.已知一个有理数类zrf_Ratio,包含私有(syu)数据成员:分子num和分母den,以及公有函数成员friendostream&operator(ostream&ostr,constzrf_Ratio&r)returnostrr.num/r.den;请补充该类的构造函数,并实现如下的操作符重载形式:zrf_Ratio&operator=(constzrf_Ratio&);zrf_Ratio&operator*=(constzrf_Ratio&);zrf_Ratio&operator+();zrf_Ratiooperator+(int);第35页/共3

23、8页第三十五页,共39页。2024/7/30362024/7/30Tsinghua University, lily36作业(zuy)直接在网络学堂上提交提交方法:压缩成一个文件不要到最后一分钟才交(有可能会造成迟交,如网络过于拥挤)只要(zhyo)提交源程序提交前请检查:压缩文件中的内容是否正确提交后请检查:是否提交成功第36页/共38页第三十六页,共39页。2024/7/30372024/7/30Tsinghua University, lily37ThankYouVictorybelongstothemostpreserving.-NapoleonBonaparte第37页/共38页第三十七页,共39页。2024/7/30TsinghuaUniversity,lily38感谢您的欣赏(xnshng)!第38页/共38页第三十八页,共39页。内容(nirng)总结2021/11/10。纲要(gngyo)第1部分:多态性概念。纲要(gngyo)第2部分:运算符重载。问题举例复数的运算。用“+”、“-”能够实现复数的加减运算吗。Minute=Minute-60。流运算符应该重载为友元函数。流运算符的左操作数应为流对象。RMB d3(0,0)。提交后请检查: 是否提交成功。第37页/共38页。感谢您的欣赏第三十九页,共39页。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号