C暑期实践课程第08讲.ppt

上传人:夏** 文档编号:571252789 上传时间:2024-08-09 格式:PPT 页数:39 大小:572.50KB
返回 下载 相关 举报
C暑期实践课程第08讲.ppt_第1页
第1页 / 共39页
C暑期实践课程第08讲.ppt_第2页
第2页 / 共39页
C暑期实践课程第08讲.ppt_第3页
第3页 / 共39页
C暑期实践课程第08讲.ppt_第4页
第4页 / 共39页
C暑期实践课程第08讲.ppt_第5页
第5页 / 共39页
点击查看更多>>
资源描述

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

1、2024/8/9Tsinghua University, lily12024/8/9Tsinghua University, lily1第第 8讲讲 多态性多态性运算符重载运算符重载李莉李莉( lily)清华大学计算机系清华大学计算机系2024/8/9Tsinghua University, lily22024/8/9Tsinghua University, lily2本讲总体纲要本讲总体纲要第第1部分部分: 多态性概念多态性概念第第2部分部分: 运算符重载运算符重载 2024/8/9Tsinghua University, lily32024/8/9Tsinghua University,

2、lily3第第1部分部分:多多态性概念性概念2024/8/9Tsinghua University, lily42024/8/9Tsinghua University, lily4纲要纲要第第1部分部分:多多态性概念性概念多态性的概念多态性的概念多态性的形式多态性的形式2024/8/9Tsinghua University, lily5 5多态性的概念多态性是面向对象程序设计的重要特征之一。多态从实现的角度来讲可以划分为两类:编译时的多态和运行时的多态。前者是在编译的过程中确定了同名操作的具体操作对象,而后者则是在程序运行过程中才动态地确定操作所针对的具体对象。 2024/8/9Tsinghu

3、a University, lily6 6多态的形式常见形式函数重载运算符重载虚函数2024/8/9Tsinghua University, lily72024/8/9Tsinghua University, lily7本讲总体纲要本讲总体纲要第第1部分部分: 多态性概念多态性概念第第2部分部分: 运算符重载运算符重载2024/8/9Tsinghua University, lily82024/8/9Tsinghua University, lily8第第2部分部分: 运算符重运算符重载2024/8/9Tsinghua University, lily92024/8/9Tsinghua Uni

4、versity, lily9纲要纲要第第2部分部分:运算符重运算符重载为何需要重载运算符?为何需要重载运算符?运算符重载的实质、形式以及规则和限制运算符重载的实质、形式以及规则和限制运算符重载为类的成员函数运算符重载为类的成员函数运算符重载为类的友元函数运算符重载为类的友元函数流运算符重载流运算符重载2024/8/9Tsinghua University, lily1010为何需要重载运算符?C+把用户定义的类和基本数据类型一样看待。系统为基本数据定义了运算符(如+-*/)。C+中预定义的运算符其运算对象只能是基本数据类型,而不适用于用户自定义类型(如类)。允许用户自定义的类类型定义这些运算符

5、。重新定义运算符的运算规则就称为重载运算符。运算符重载能提高程序可读性,但并不是必须的。运算符重载看作类中提供的另一种形式的接口。2024/8/9Tsinghua University, lily1111问题举例复数的运算class complex/复数类声明public:complex(double r=0.0,double i=0.0) /构造函数 real=r; imag=i; void display();/显示复数的值 complex add(complex c2); /成员函数private:double real;double imag;2024/8/9Tsinghua Univ

6、ersity, lily1212complex complex:add(complex c2) complex c;c.real=c2.real+real;c.imag=c2.imag+imag;return complex(c.real,c.imag);int main() /主函数主函数 complex c1(5,4),c2(2,10),c3; c3=c1.add(c2); return 0;2024/8/9Tsinghua University, lily1313问题举例复数的运算用“+”、“-”能够实现复数的加减运算吗? complex c1(5,4),c2(2,10),c3; c3=

7、c1 + c2;实现复数加减运算的方法 重载“+”、“-”运算符2024/8/9Tsinghua University, lily1414complex complex: operator +(complex c2) complex c;c.real=c2.real+real;c.imag=c2.imag+imag;return complex(c.real,c.imag);int main() /主函数主函数 complex c1(5,4),c2(2,10),c3; c3=c1+c2; /相当于相当于c1.operator+(c2) return 0;2024/8/9Tsinghua Uni

8、versity, lily1515运算符重载的实质运算符重载是对已有的运算符赋予多重含义,实质就是函数重载 。实现机制将指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参。编译系统对重载运算符的选择,遵循函数重载的选择原则。(根据实参的类型来确定需要调用的函数)2024/8/9Tsinghua University, lily1616规则和限制可以重载C+中除下列运算符外的所有运算符:. .* : ?: sizeof 只能重载C+语言中已有的运算符,不可臆造新的。不能改变操作数个数。不改变原运算符的优先级和结合性。经重载的运算符,其操作数中至少应该有一个是自定义类型。20

9、24/8/9Tsinghua University, lily1717两种形式重载为类成员函数。重载为友元函数。2024/8/9Tsinghua University, lily1818运算符函数声明形式函数类型 operator 运算符(形参) .重载为类成员函数时 参数个数=原操作数个数-1 (后置+、-除外)重载为友元函数时 参数个数=原操作数个数,且至少应该有一个自定义类型的形参。2024/8/9Tsinghua University, lily1919运算符成员函数的设计前置单目运算符 +和-如果要重载运算符 +和-为类成员函数,使之能够实现表达式 +a或 -a,其中 a 为A类对象

10、,则 +或- 应被重载为 A 类的成员函数,无形参。经重载后,表达式 +a相当于 a.operator +( )2024/8/9Tsinghua University, lily2020运算符成员函数的设计后置单目运算符 +和-如果要重载 +或-为类成员函数,使之能够实现表达式 a+ 或 a- ,其中 a 为A类对象,则 +或- 应被重载为 A 类的成员函数,且具有一个 int 类型形参。经重载后,表达式 a+ 相当于 a.operator +(0)2024/8/9Tsinghua University, lily2121运算符成员函数举例运算符前置+和后置+重载为时钟类的成员函数。前置单目运

11、算符,重载函数没有形参,对于后置单目运算符,重载函数需要有一个整型形参。操作数是时钟类的对象。实现时间增加1秒钟。2024/8/9Tsinghua University, lily22#includeusing namespace std;class Clock /时钟类声明 public:/外部接口 Clock(int NewH=0, int NewM=0, int NewS=0); void ShowTime(); Clock& operator +(); /前置单目运算符重载 Clock operator +(int); /后置单目运算符重载 private:/私有数据成员 int Ho

12、ur,Minute,Second;222024/8/9Tsinghua University, lily23Clock& Clock:operator +()/前置单目运算符重载函数 Second+;if(Second=60) Second=Second-60; Minute+; if(Minute=60) Minute=Minute-60; Hour+; Hour=Hour%24; return *this;232024/8/9Tsinghua University, lily24/后置单目运算符重载Clock Clock:operator +(int)/注意形参表中的整型参数 Clock

13、old(*this); +(*this); return old;24后置运算符运算结果是后置运算符运算结果是操作数变化前的值,所操作数变化前的值,所以编译器须先将操作数以编译器须先将操作数的原始值存放在一个临的原始值存放在一个临时单元中。后置运算符时单元中。后置运算符最容易滋生副作用。最容易滋生副作用。2024/8/9Tsinghua University, lily25/其它成员函数的实现略int main()Clock myClock(23,59,59);coutFirst time output:;myClock.ShowTime(); coutShow myClock+:; (myC

14、lock+).ShowTime(); coutShow +myClock:;(+myClock).ShowTime();252024/8/9Tsinghua University, lily2626运算符友元函数的设计如果需要重载一个运算符,使之能够用于操作某类对象的私有成员,可以此将运算符重载为该类的友元函数。函数的形参代表依自左至右次序排列的各操作数。后置单目运算符 +和-的重载函数,形参列表中要增加一个int,但不必写形参名。2024/8/9Tsinghua University, lily2727运算符友元函数的设计双目运算符 B重载后,表达式oprd1 B oprd2 等同于oper

15、ator B(oprd1,oprd2 )前置单目运算符 B重载后,表达式 B oprd 等同于operator B(oprd )后置单目运算符 +和-重载后,表达式 oprd B 等同于operator B(oprd,0 )2024/8/9Tsinghua University, lily2828运算符友元函数举例将+、-(双目)重载为复数类的友元函数。两个操作数都是复数类的对象。2024/8/9Tsinghua University, lily29#includeusing namespace std;class complex/复数类声明public:/外部接口complex(double

16、 r=0.0,double i=0.0) real=r; imag=i; /构造函数friend complex operator + (complex c1,complex c2);/运算符+重载为友元函数friend complex operator - (complex c1,complex c2);/运算符-重载为友元函数void display();/显示复数的值private:/私有数据成员double real;double imag;292024/8/9Tsinghua University, lily30complex operator +(complex c1,comple

17、x c2)/运算符重载友元函数实现 return complex(c2.real+c1.real, c2.imag+c1.imag);complex operator -(complex c1,complex c2) /运算符重载友元函数实现 return complex(c1.real-c2.real, c1.imag-c2.imag);302024/8/9Tsinghua University, lily3131流运算符应该重载为友元函数 流运算符的左操作数应为流对象。如果一个重载的运算符是一个成员函数,那么它的左操作数是*this,它是类的一个对象,而函数是类的成员。 2024/8/9T

18、singhua University, lily3232值返回与引用返回运算符重载的返回值一般都是类的对象,但为何有的是值返回,有的是引用返回。如果返回的是一个临时对象,就必须采用值返回,而不能采用引用返回。如果返回值希望再作为左值,就应该采用引用返回,而不是值返回。2024/8/9Tsinghua University, lily3333#includeusing namespace std;class RMBpublic:RMB(unsigned int d,unsigned int c);RMB operator +(RMB&); RMB& operator +();RMB operat

19、or +(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;2024/8/9Tsinghua University, lily3535RMB R

20、MB: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;2024/8/9Tsinghua University, lily3636int main()RMB d1(1,60);RMB d2(2,50);RMB d3(0,0);d3= d1 +

21、 d2;d3.display();(+d3).display();+(+d3);+(+(+d3);d3.display();(d3+).display();(d3+)+);(d3+)+)+);d3.display(); coutd3;return 0;2024/8/9Tsinghua University, lily372024/8/9Tsinghua University, lily37作业作业1. 已知一个有理数类zrf_Ratio,包含私有数据成员:分子num和分母den, 以及公有函数成员 friend ostream& operator(ostream& ostr, const zr

22、f_Ratio& r) return ostr r.num / r.den; 请补充该类的构造函数,并实现如下的操作符重载形式: 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*(const zrf_Ratio&, const zrf_Ratio&

23、); friend zrf_Ratio operator/(const zrf_Ratio&, const zrf_Ratio&);2. 已知一个有理数类zrf_Ratio,包含私有数据成员:分子num和分母den, 以及公有函数成员 friend ostream& operator(ostream& ostr, const zrf_Ratio& r) return ostr r.num / r.den; 请补充该类的构造函数,并实现如下的操作符重载形式: zrf_Ratio& operator=(const zrf_Ratio&); zrf_Ratio& operator*=(const z

24、rf_Ratio&); zrf_Ratio& operator+(); zrf_Ratio operator+(int);2024/8/9Tsinghua University, lily382024/8/9Tsinghua University, lily38作业直接在网络学堂上提交作业直接在网络学堂上提交提交方法提交方法: 压缩成一个文件压缩成一个文件不要到最后一分钟才交不要到最后一分钟才交( (有可能会造成迟交,如网有可能会造成迟交,如网络过于拥挤络过于拥挤) )只要提交源程序只要提交源程序提交前请检查提交前请检查: 压缩文件中的内容是否正压缩文件中的内容是否正确确提交后请检查提交后请检查: 是否提交成功是否提交成功2024/8/9Tsinghua University, lily392024/8/9Tsinghua University, lily39Thank YouVictory belongs to the most preserving. -Napoleon Bonaparte

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

最新文档


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

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