




已阅读5页,还剩34页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2019/4/28,Tsinghua University, lily,1,2019/4/28,Tsinghua University, lily,1,第 8讲 多态性运算符重载,李莉( lily) 清华大学计算机系,2019/4/28,Tsinghua University, lily,2,2019/4/28,Tsinghua University, lily,2,本讲总体纲要,第1部分: 多态性概念 第2部分: 运算符重载,2019/4/28,Tsinghua University, lily,3,2019/4/28,Tsinghua University, lily,3,第1部分: 多态性概念,2019/4/28,Tsinghua University, lily,4,2019/4/28,Tsinghua University, lily,4,纲要第1部分:多态性概念,多态性的概念 多态性的形式,2019/4/28,Tsinghua University, lily,5,5,多态性的概念,多态性是面向对象程序设计的重要特征之一。 多态从实现的角度来讲可以划分为两类:编译时的多态和运行时的多态。前者是在编译的过程中确定了同名操作的具体操作对象,而后者则是在程序运行过程中才动态地确定操作所针对的具体对象。,2019/4/28,Tsinghua University, lily,6,6,多态的形式,常见形式 函数重载 运算符重载 虚函数,2019/4/28,Tsinghua University, lily,7,2019/4/28,Tsinghua University, lily,7,本讲总体纲要,第1部分: 多态性概念 第2部分: 运算符重载,2019/4/28,Tsinghua University, lily,8,2019/4/28,Tsinghua University, lily,8,第2部分: 运算符重载,2019/4/28,Tsinghua University, lily,9,2019/4/28,Tsinghua University, lily,9,纲要第2部分: 运算符重载,为何需要重载运算符? 运算符重载的实质、形式以及规则和限制 运算符重载为类的成员函数 运算符重载为类的友元函数 流运算符重载,2019/4/28,Tsinghua University, lily,10,10,为何需要重载运算符?,C+把用户定义的类和基本数据类型一样看待。系统为基本数据定义了运算符(如+-*/)。C+中预定义的运算符其运算对象只能是基本数据类型,而不适用于用户自定义类型(如类)。 允许用户自定义的类类型定义这些运算符。 重新定义运算符的运算规则就称为重载运算符。 运算符重载能提高程序可读性,但并不是必须的。 运算符重载看作类中提供的另一种形式的接口。,2019/4/28,Tsinghua University, lily,11,11,问题举例复数的运算,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; ;,2019/4/28,Tsinghua University, lily,12,12,complex 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; ,2019/4/28,Tsinghua University, lily,13,13,问题举例复数的运算,用“+”、“-”能够实现复数的加减运算吗? complex c1(5,4),c2(2,10),c3; c3=c1 + c2; 实现复数加减运算的方法 重载“+”、“-”运算符,2019/4/28,Tsinghua University, lily,14,14,complex 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; ,2019/4/28,Tsinghua University, lily,15,15,运算符重载的实质,运算符重载是对已有的运算符赋予多重含义,实质就是函数重载 。 实现机制 将指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参。 编译系统对重载运算符的选择,遵循函数重载的选择原则。(根据实参的类型来确定需要调用的函数),2019/4/28,Tsinghua University, lily,16,16,规则和限制,可以重载C+中除下列运算符外的所有运算符: . .* : ?: sizeof 只能重载C+语言中已有的运算符,不可臆造新的。 不能改变操作数个数。 不改变原运算符的优先级和结合性。 经重载的运算符,其操作数中至少应该有一个是自定义类型。,2019/4/28,Tsinghua University, lily,17,17,两种形式,重载为类成员函数。 重载为友元函数。,2019/4/28,Tsinghua University, lily,18,18,运算符函数,声明形式 函数类型 operator 运算符(形参) 重载为类成员函数时 参数个数=原操作数个数-1 (后置+、-除外) 重载为友元函数时 参数个数=原操作数个数,且至少应该有一个自定义类型的形参。,2019/4/28,Tsinghua University, lily,19,19,运算符成员函数的设计,前置单目运算符 +和- 如果要重载运算符 +和-为类成员函数,使之能够实现表达式 +a或 -a,其中 a 为A类对象,则 +或- 应被重载为 A 类的成员函数,无形参。 经重载后, 表达式 +a相当于 a.operator +( ),2019/4/28,Tsinghua University, lily,20,20,运算符成员函数的设计,后置单目运算符 +和- 如果要重载 +或-为类成员函数,使之能够实现表达式 a+ 或 a- ,其中 a 为A类对象,则 +或- 应被重载为 A 类的成员函数,且具有一个 int 类型形参。 经重载后,表达式 a+ 相当于 a.operator +(0),2019/4/28,Tsinghua University, lily,21,21,运算符成员函数举例,运算符前置+和后置+重载为时钟类的成员函数。 前置单目运算符,重载函数没有形参,对于后置单目运算符,重载函数需要有一个整型形参。 操作数是时钟类的对象。 实现时间增加1秒钟。,2019/4/28,Tsinghua University, lily,22,#include using namespace std; class Clock /时钟类声明 public: /外部接口 Clock(int NewH=0, int NewM=0, int NewS=0); void ShowTime(); Clock,22,2019/4/28,Tsinghua University, lily,23,Clock ,23,2019/4/28,Tsinghua University, lily,24,/后置单目运算符重载 Clock Clock:operator +(int) /注意形参表中的整型参数 Clock old(*this); +(*this); return old; ,24,后置运算符运算结果是操作数变化前的值,所以编译器须先将操作数的原始值存放在一个临时单元中。后置运算符最容易滋生副作用。,2019/4/28,Tsinghua University, lily,25,/其它成员函数的实现略 int main() Clock myClock(23,59,59); cout“First time output:“; myClock.ShowTime(); cout“Show myClock+:“; (myClock+).ShowTime(); cout“Show +myClock:“; (+myClock).ShowTime(); ,25,2019/4/28,Tsinghua University, lily,26,26,运算符友元函数的设计,如果需要重载一个运算符,使之能够用于操作某类对象的私有成员,可以此将运算符重载为该类的友元函数。 函数的形参代表依自左至右次序排列的各操作数。 后置单目运算符 +和-的重载函数,形参列表中要增加一个int,但不必写形参名。,2019/4/28,Tsinghua University, lily,27,27,运算符友元函数的设计,双目运算符 B重载后, 表达式oprd1 B oprd2 等同于operator B(oprd1,oprd2 ) 前置单目运算符 B重载后, 表达式 B oprd 等同于operator B(oprd ) 后置单目运算符 +和-重载后, 表达式 oprd B 等同于operator B(oprd,0 ),2019/4/28,Tsinghua University, lily,28,28,运算符友元函数举例,将+、-(双目)重载为复数类的友元函数。 两个操作数都是复数类的对象。,2019/4/28,Tsinghua University, lily,29,#include using namespace std; class complex /复数类声明 public: /外部接口 complex(double 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; ;,29,2019/4/28,Tsinghua University, lily,30,complex operator +(complex c1,complex 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); ,30,2019/4/28,Tsinghua University, lily,31,31,流运算符应该重载为友元函数,流运算符的左操作数应为流对象。 如果一个重载的运算符是一个成员函数,那么它的左操作数是*this,它是类的一个对象,而函数是类的成员。,2019/4/28,Tsinghua University, lily,32,32,值返回与引用返回,运算符重载的返回值一般都是类的对象,但为何有的是值返回,有的是引用返回。 如果返回的是一个临时对象,就必须采用值返回,而不能采用引用返回。 如果返回值希望再作为左值,就应该采用引用返回,而不是值返回。,2019/4/28,Tsinghua University, lily,33,33,#include using namespace std; class RMB public: RMB(unsigned int d,unsigned int c); RMB operator +(RMB,2019/4/28,Tsinghua University, lily,34,34,RMB:RMB(unsigned int d,unsigned int c) yuan = d;jf = c; while (jf=100) yuan+;jf-=100; RMB RMB:operator +(RMB,2019/4/28,Tsinghua University, lily,35,35,RMB RMB:operator +(int) RMB temp(*this); +(*this); return temp; void RMB:display() cout (yuan + jf/100.0)endl; ostream ,2019/4/28,Tsinghua University, lily,36,36,int main() RMB d1(1,60); RMB d2(2,50); RMB d3(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年滨州邹平怀远学校教师考前自测高频考点模拟试题带答案详解
- 【中考专题】2026年中考数学专项提优复习:方程与方程组【附答案】
- 2025汽车融资租赁合同范例
- 2025昆仑数智科技有限责任公司春季高校毕业生招聘15人模拟试卷及完整答案详解1套
- 2025湖南怀化国际陆港辰溪港区发展有限责任公司招聘工作人员拟聘用人员考前自测高频考点模拟试题及答案详解(考点梳理)
- 2025年河北廊坊市农林科学院公开选聘博士研究生1名考前自测高频考点模拟试题及参考答案详解1套
- 2025第二季度贵州安顺市平坝区美农科技有限公司招聘9人考前自测高频考点模拟试题及答案详解(必刷)
- 2025北京首都师范大学实验小学招聘2人模拟试卷附答案详解
- 2025杭州市钱塘区教育局所属事业单位高层次人才引进15人模拟试卷及参考答案详解一套
- 2025福建厦门市集美区实验小学顶岗教师招聘1人考前自测高频考点模拟试题及答案详解(易错题)
- 浙教版七年级下册科学-优化训练-第二章单元测试卷
- 民办学校未来发展策划与实施方案
- 临床课题申报书范例范文
- 山体.施工合同样本
- 肺结核课件培训
- 收单外包管理办法
- 维力能醋酸钠林格注射液
- 五四制青岛版2022-2023五年级科学上册第四单元第12课《安全用药》课件(定稿)
- 直播场景搭建
- 专题复习七选五的解题技巧课件(共22张)-副本-副本
- 智能网联汽车环境感知系统课件
评论
0/150
提交评论