




免费预览已结束,剩余61页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课件作者 刘葳 第10章运算符重载 1 0 操作符重载的需要性 C 语言本身没有提供复数类型 可定义一个类来实现 classComplex 复数类定义 public Complex doubler 0 0 doublei 0 0 real r imag i voiddisplay const cout real imag i private doublereal doubleimag 如何实现两个复数 类型为Complex 相加 一种方案 为Complex类定义一个成员函数add 例如 classComplex public Complexadd constComplex 另一种方案 定义一个友元函数 例如 classComplex 复数类定义 friendComplexcomplex add constComplex 在前面的两种实现中 针对复数的加法操作 其形式不符合数学上的习惯 c a b 如何将其以数学的书写形式实现复数相加 这时就出现了运算符重载的概念c 具备这一功能 可以解决这个问题 1 什么是运算符重载 运算符重载的含义是 对已有的运算符进行重新定义 使它具有新的功能 即就是用同一个运算符完成不同的运算操作 例如 用 运算符完成两个实数 两个复数 两个字符串的相关运算 6 1 什么是运算符重载 7 实数设 c1 10 c2 20 则 c1 c2 10 20 30复数设 c1 10 10i c2 20 20i 则 c1 c2 30 30i字符串设 c1 ABCD c2 EFGH 则c1 c2 ABCDEFGH 这就是 运算符的重载 2 运算符重载的方法 为了重载运算符 必须定义一个函数 并告诉编译器 遇到这个重载运算符就调用该函数 由这个函数来完成该运算符应该完成的操作 这种函数称为运算符重载函数 它通常是类的成员函数或者是友元函数 运算符的操作数通常也应该是类的对象 8 2 运算符重载的方法 重载运算符的函数一般形式 函数类型operator运算符名称 形参表 函数体 对运算符的重载处理 9 3 重载运算符的规则 不允许用户定义新的运算符 只能对c 已有的运算符进行重载C 允许重载的运算符见表10 1 P313 不能重载的运算符有5个 见下页的表重载不能改变运算符运算对象 操作数 的个数重载不能改变运算符的优先级 结合性重载运算符的函数不能有默认的参数 见书P313 314 10 3 重载运算符的规则 11 C 中不允许重载的运算符 4 运算符重载函数作为类成员函数和友元函数 12 运算符重载的函数有两种方式 把运算符重载的函数作为类的成员函数把运算符重载函数作为类的友元函数 4 运算符重载函数作为类成员函数和友元函数 13 1 运算符重载函数作为类成员函数定义格式如下 operator 函数体 运算的对象 关键字 Aoperator A 重载了类A的 运算符 返回类型 函数名 运算的对象 其中 operator是定义运算符重载函数的关键字 它与其后的运算符一起构成函数名 4 运算符重载函数作为类成员函数和友元函数 调用格式 实参表 例如 在进行两个对象的二元运算时 其程序中所用到语法格式为 如 c1 c2而执行上述语句时 系统将自动转换成对重载函数的调用格式 c1 operator c2 14 15 classA private inti public A inta 0 i a voidShow cout i i endl Aoperator A 使用重载运算符的例子 运行结果 i 10i 20i 30 相当于a3 a1 operator a2 即 左操作数作为调用重载函数的对象 右操作数作为调用重载函数的实参 i的值是实参a1 i 即为10 虚参a接收实参a2的值 所以a i 20 16 classA private inti public A inta 0 i a voidShow void cout i i endl voidAddA A 没有重载运算符的例子 利用函数完成了加法运算 重载运算符与一般函数的比较 相同 1 均为类的成员函数 2 实现同一功能 voidAddA A 返回值 函数名 由对象a3调用 Aoperator A 形参列表 返回值 函数名 由对象a1调用 形参 是对象的引用 includeclassRoom private doubleLength Wide public Room doublea 0 0 doubleb 0 0 Length a Wide b voidShow void cout Length Length t Wide Wide endl Roomoperator Room voidmain void Roomr1 3 2 r2 1 4 r3 r4 r1 Show r2 Show r3 r1 r2 r3 Show r4 r1 r2 r3 r4 Show 相当于r3 r1 operator r2 1 19 运算符的优先级和结合律是不能改变的 includeclassComplex public Complex real 0 imag 0 Complex doubler doublei real r imag i Complexoperator Complex 使用运算符重载实现复数加运算 intmain Complexc1 3 4 c2 5 10 c3 c3 c1 c2 cout c1 c1 display cout c2 c2 display cout c3 c3 display 相当于c3 c1 operator c2 例 实现复数的 等于 操作 classComplex doublereal imag public booloperator constComplex if c1 c2 4 运算符重载函数作为类成员函数和友元函数 2 运算符重载函数作为类的友元函数友元函数是在类外的普通函数 与一般函数的区别是可以调用类中的私有或保护数据 将运算符的重载函数定义为友元函数时 参与运算的对象全部要成为函数参数 23 4 运算符重载函数作为类成员函数和友元函数 运算符重载函数作为类友元函数的定义格式 说明 形参1与形参2为参加运算的两个对象的引用 当重载函数为友元普通函数时 该重载函数不能用对象调用 因此参加运算的两个对象必须以参数的方式传送到重载函数体内 所以形参通常为两个参加运算的对象引用 24 形参1 形参2 函数体 4 运算符重载函数作为类成员函数和友元函数 例如 Aa b c c a b 实际上是c operator a b c a 实际上是c operator a c a 实际上是operator c a 说明 参加运算的操作数均作为函数的参数 红色字体表示 25 4 运算符重载函数作为类成员函数和友元函数 例10 3 将运算符 重载为适用于复数的加法 重载函数放在类外 作为类的友元函数 代码如下 26 includeclassComplex public Complex real 0 imag 0 Complex doubler real r imag 0 Complex doubler doublei real r imag i friendComplexoperator Complex Complexoperator Complex 相当于c3 operator c1 c2 5 重载双目运算符 双目运算是指有两个操作数的运算 操作数在运算符的两侧 前面举的实例都是双目运算 双目运算符既可以重载为成员函数 也可以重载为类的友元函数 29 5 重载双目运算符 双目运算重载为成员函数的定义格式class operator 代表可重载的操作符 operator 使用格式a b a b或 a operator b 30 5 重载双目运算符 双目运算重载为友元函数的定义格式operator 使用格式为 a b a b或operator a b 31 5 重载双目运算符 例10 4 定义一个字符串类String 用来存放不定长度的字符串 重载运算符 用于两个字符串的等于 小于和大于的比较运算 注 从简单到最终完成 可分以下几个步骤 32 includeclassString String是用户自己指定的类名 public String p NULL String char str voiddisplay private char p String String char str p str voidString display cout p intmain Stringstring1 Hello Stringstring2 Book string1 display cout endl string2 display return0 第1步 创建类String 编写简单程序框架 include includeclassString public String p NULL String char str friendbooloperator String 第2步 增加运算符重载部分 先增加重载运算符 String String char str p str voidString display cout String 相当于operator string1 string2 include includeclassString public String p NULL String char str friendbooloperator String 第3步 扩展到3个运算符重载 String String char str p str voidString display cout String booloperator String 相当于 operator string1 string2 operator string1 string2 5 重载双目运算符 第4步 进一步修饰 完善 使其更直观 详细代码见 P321 P322 39 6 重载单目运算符 40 单目运算是指 只有一个操作数的运算 所以也称一元运算 如 a i j 等等 单目运算符既可以重载为成员函数 也可以重载为类的友元函数 6 重载单目运算符 41 单目运算符重载为成员函数的定义格式 class operator operator 使用格式 a a或 a operator 6 重载单目运算符 42 单目运算符重载为友元函数的定义格式 定义格式operator 使用格式为 a a或operator a 例 实现复数的取反操作 classComplex public Complexoperator const Complextemp temp real real temp imag imag returntemp Complexa 1 2 b b a 把b修改成a的负数 6 重载单目运算符 44 典型单目运算符为 或 它们分别有前置与后置两种 如果没有特殊说明 它们的前置用法与后置用法均使用同一个重载函数 operator 为了能够区分 的前置与后置用法 可为它们再写一个重载函数用于实现它们的后置用法 该重载函数应有一个形式上的int型参数 operator int 6 重载单目运算符 45 以 运算为例 重载函数定义 为前置运算符 定义格式 operator 函数体 为后置运算符 定义格式 operator int 函数体 重载函数的调用格式 前置 运算符 调用格式 operator 后置 运算符 调用格式 operator 1 用来区分是前置还是后置运算 没有实际意义 详细内容自学 classCounter intvalue public Counter value 0 Counter 使用的是上述类定义中带int型参数操作符 重载函数 6 重载单目运算符 47 以前置 为例 例10 5 有一个Time类 包含2个数据成员 minute 分 和sec 秒 模拟秒表 每次走1秒 满60秒进1分钟 此时秒又从0算起 要求输出分和秒的值 注意 使用 前置运算符完成 includeusingnamespacestd classTime public Time minute 0 sec 0 默认构造函数Time intm ints minute m sec s 构造函数重载Timeoperator 声明运算符重载成员函数voiddisplay 定义输出时间函数 cout minute sec endl private intminute intsec TimeTime operator if sec 60 sec sec 60 minute return this 返回自加后的当前对象 intmain Timetime1 34 0 for inti 0 i 61 i time1 time1 display return0 如果改变显示方式为类似秒表方式 可以在主函数增加一条语句 即改为 for inti 0 i 61 i system cls 清屏 time1 time1 display includeusingnamespacestd classTime public Time minute 0 sec 0 Time intm ints minute m sec s Timeoperator voiddisplay cout minute sec endl private intminute intsec TimeTime operator if sec 60 sec 60 minute return this intmain Timetime1 34 0 for inti 0 i 61 i system cls time1 time1 display return0 53 总结 对二元运算符 重载为成员函数时 仅一个参数 另一个被隐含 重载为友元函数时 有两个参数 没有隐含参数 一般来说 一元运算符最好被重载为成员函数 对二元运算符最好被重载为友元函数 假定要对类AB定义减号操作符重载成员函数 实现两个AB类对象的减法 并返回相减结果 则该成员函数的声明语句为 A ABoperator AB 54 练习 B 7 重载流插入运算符 C 编译系统在其类库中提供了iostream类 该类由包括 输入流类istream和输出流类ostream 而cin和cout分别是istream类和ostream类的对象 所以 如果在程序中使用 cout 则必须在程序的开始添加头文件 iostream h 55 C 编译系统已经对 进行了重载 使之作为流插入运算符和流提取运算符 能用来输出和输入C 标准类型的数据 用户自己定义的类型的数据 如对象 是
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高中史记选读课件
- 高中化学氧气课件
- 纺织服装行业市场前景及投资研究报告:研究分析方法
- 2025-2026学年人教精通版(2024)英语四年级上册全册(教案)教学设计
- 吊盘信号工岗位责任与应急处理能力合同
- 离婚子女抚养权争夺案件调解与心理辅导合同
- 离婚协议书制作要点及财产分割与子女抚养参考
- 园艺分享花卉经验
- 职业教育学生技能训练指导方案细则
- 心理素质的塑造和提升方案
- 2025年第一届安康杯安全生产知识竞赛试题题库及答案(完整版)
- 贵州省贵阳市2026届高三上学期摸底考试数学试卷含答案
- 公司年度员工安全教育培训计划
- 生育津贴相关管理办法
- 供电所安全教育培训课件
- 2023-2025年中考语文试题分类汇编:记叙文阅读(辽宁专用)解析版
- 2025年杭州市上城区望江街道办事处 编外人员招聘8人考试参考试题及答案解析
- 百果园水果知识培训资料课件
- 2025年公路检测工程师《水运结构与地基》试题及答案
- 隔爆水棚替换自动隔爆装置方案及安全技术措施
- 叙事医学培训课件
评论
0/150
提交评论