




已阅读5页,还剩39页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 第4章运算符重载 2 4 1什么是运算符重载 对已有的运算符赋予新的含义 用一个运算符表示不同功能的运算 这就是运算符重载 运算符重载的本质 对已有的运算符赋予多重含义 3 classComplex public Complex real 0 imag 0 Complex doubler doublei real r imag i Complexcomplex add Complex 例4 1通过成员函数实现复数的加法 4 ComplexComplex complex add Complex 5 运算符重载的方法 定义一个重载运算符的函数 在需要时系统自动调用该函数 完成相应的运算 运算符重载实质上是函数的重载 运算符重载函数的格式是 函数类型operator运算符名 形参 对运算符的重载处理 4 2运算符重载的方法 6 classComplex public Complex real 0 imag 0 Complex doubler doublei real r imag i Complexoperator Complex 例4 2重载运算符 用于两个复数相加 函数名 7 ComplexComplex operator Complex 8 intmain Complexc1 3 4 c2 5 10 c3 c3 c1 c2 cout c1 c1 display cout c2 c2 display cout c1 c2 c3 display return0 等价于c1 operator c2 9 必要性C 中预定义的运算符其运算对象只能是基本数据类型 而不适用于用户自定义类型 如类 实现机制将指定的运算表达式转化为对运算符函数的调用 运算对象转化为运算符函数的实参 4 2运算符重载的方法 10 运算符重载的好处 运算符重载和类结合起来 可以在C 中定义出有实际意义而使用方便的新的数据类型 注意 运算符被重载后 其原来的功能仍然保留 编译系统根据运算表达式的上下文决定是否调用运算符重载函数 4 2运算符重载的方法 11 C 不允许用户自己定义新的运算符 只允许对已有的部分运算符进行重载 不能重载的运算符只有5个 成员运算符 成员指针运算符 域运算符sizeof长度运算符 条件运算符重载不能改变运算符操作数的个数 4 3重载运算符的规则 12 重载不能改变运算符的优先级 重载不能改变运算符的结合性 重载运算符的函数不能有默认的参数 运算符重载函数必须和用户定义的自定义类型的对象一起使用 其参数至少有一个类对象或类对象的引用 4 3重载运算符的规则 13 用于类对象的运算符一般必须重载 但是运算符 和 除外 应当使重载运算符的功能类似于该运算符作用于标准类型数据时所实现的功能 运算符重载函数可以是类的成员函数 也可以是类的友元函数 还可以是普通函数 4 3重载运算符的规则 14 重载为类成员函数时参数个数 原操作数个数 1重载为友元函数时参数个数 原操作数个数且至少应该有一个自定义类型的形参例4 3将加法运算符重载为适用于复数加法 重载函数作为类的友元函数 4 4运算符重载函数作为类成员函数和友元函数 15 includeclassComplex public Complex real 0 imag 0 Complex doubler real r imag 0 Complex doubler doublei real r imag i friendComplexoperator Complex 16 Complexoperator Complex 等价于c3 operator c1 c2 17 如想将一个复数和一个整数相加 运算符重载函数作为成员函数定义如下 ComplexComplex operator int 什么时候用成员函数或友元函数 18 如果要求在使用重载运算符时 运算符左侧操作数不是对象 就不能使用前面定义的运算符重载函数 可以将运算符重载函数定义为友元函数 friendComplexoperator int error 什么时候用成员函数或友元函数 19 为了实现加法的交换率 必须定义两个运算符重载函数 记住成员函数要求运算符左侧的操作数必须是自定义类型的对象 而友元函数没有这个限制 可以用下面两个组合中任意一个 成员函数 左操作数是对象 右操作数是非对象 友元函数 左操作数是非对象 右操作数是对象 友元函数 左操作数是对象 右操作数是非对象 友元函数 左操作数是非对象 右操作数是对象 什么时候用成员函数或友元函数 20 4 5重载双目运算符 双目的意思是运算符左边和右边的操作数均参加运算 例4 4定义一个字符串类String 用来处理不定长的字符串 重载相等 大于 小于关系运算符 用于两个字符串的等于 大于 小于的比较运算 21 includeusingnamespacestd classString public String p NULL String char str voiddisplay private char p 1 先建立一个String类 22 String String char str p str voidString display cout p intmain Stringstring1 Hello string2 Book string1 display cout endl string2 display return0 23 2 增加重载运算符 部分 includeclassString public String p NULL String char str friendbooloperator String 24 voidString display cout String 25 3 扩展到对三个运算符重载 includeclassString public String p NULL String char str friendbooloperator String 26 String String char str p str voidString display cout String 27 booloperator String 28 intmain Stringstring1 Hello string2 Book string3 Computer coutstring2 endl cout string1 string3 endl cout string1 string2 endl return0 运行结果为100 29 4 6重载单目运算符 单目运行符只有一个操作数 由于只有一个操作数 重载函数最多只有一个参数 如果将运算符重载函数定义为成员函数还可以省略此参数 例4 5有一个Time类 包含数据成员minute和sec 模拟秒表 每次走一秒 满60秒进一分钟 此时秒又从0开始计数 要求输出分和秒的值 30 includeusingnamespacestd classTime public Time minute 0 sec 0 Time intm ints minute m sec s Timeoperator voiddisplay cout minute sec endl private intminute intsec 31 TimeTime operator if sec 60 sec 60 minute return this intmain Timetime1 34 0 for inti 0 i 61 i time1 time1 display return0 32 C 中除了有前置 外 还有后置 怎样区分前置 和后置 C 约定 如果自增 自减 运算符重载函数中 增加一个int型形参 就是后置自增 自减 运算符函数 例4 6在例4 5的基础上增加对后置自增运算符的重载 33 includeusingnamespacestd classTime public Time minute 0 sec 0 Time intm ints minute m sec s Timeoperator Timeoperator int voiddisplay cout minute sec endl private intminute intsec 34 TimeTime operator if sec 60 sec 60 minute return this TimeTime operator int Timetemp this 保存修改前的对象做返回值sec if sec 60 sec 60 minute returntemp 35 intmain Timetime1 34 59 time2 cout time1 time1 display time1 cout time1 time1 display time2 time1 cout time1 time1 display cout time2 time2 display return0 程序运行结果如下 Time1 34 59 Time1 35 0Time1 35 1Time2 35 0 36 cin和cout分别是istream类和ostream类的对象 C 已对 和把头文件包含到程序中 用户自定义类型的数据不能直接用 输出和输入 如想用它们进行输入或输出 程序员必须对它们重载 4 7重载流插入运算符和流提取运算符 37 重载函数原型的格式如下 istream从格式上看 重载函数和 重载函数只能定义为友元函数 不能定义为成员函数 因为函数有两个形参 并且第一个形参不是自定义类型 4 7重载流插入运算符和流提取运算符 38 例4 7在例4 2的基础上 用重载的 输出复数 在类中声明 重载函数是友元函数friendostream 4 7 1重载流插入运算符 39 includeintmain Complexc1 2 4 c2 6 10 c3 c3 c1 c2 cout c3 return0 operator cout c3 cout c3 c2 如何处理 cout c3 5 endl 区分 哪个是重载 40 4 7 2重载流提取运算符 例4 8在例4 7的基础上 增加重载流提取运算符 用cin 输入复数在类中声明友元函数 friendistream 41 intmain Complexc1 c2 cin c1 c2 cout c1 c1 endl cout c2 c2 endl return0 输入的虚部是负数时 输出的形式变成 c2 4 10i ostream 42 4 8不同类型数据间的转换 4 8 1标准类型数据间的转换隐式类型转换inti 6 i 7 5 i 显式类型转换类型名 数据 int 89 5 C语言 int 89 5 43 4 8不同类型数据间的转换 4 8 2用转
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 20xx教师社会实践报告3篇
- 辞职后的安全培训课件
- 基于工业物联网的冲洗机设备全生命周期数据安全与合规存储方案
- 基于区块链的刨切木方全生命周期溯源系统与供应链金融创新
- 城市立体绿化政策驱动下空调外机隐蔽式安装的工程实践探索
- 国际药典新增大黄质量控制标准对国内生产端的冲击与应对
- 后疫情时代定制刺绣旗袍的碳足迹核算与可持续时尚实践路径
- 可降解纤维在制服领域的规模化应用瓶颈与成本效益平衡策略
- 反诈中心与运营商协同响应的实时数据接口标准
- 医疗影像分析设备算法偏见对临床决策的隐性影响
- 公共机构建筑能源审计和能耗基准值技术服务方案投标文件(技术标)
- 2025-2026学年人教PEP版(2024)小学英语四年级上册教学计划及进度表
- 2025广西公需科目考试题库和答案(覆盖99%考题)广西一区两地一园一通道+人工智能时代的机遇
- 脓毒症护理查房记录
- 360上网行为管理系统产品白皮书
- 自行缴纳社保协议书模板
- 企业燃气充值管理办法
- 食材库房防霉防潮卫生管理措施
- 语法填空(话题+体裁)(原卷版+解析)-2025年高考英语冲刺复习(新高考)
- 腹透患者的饮食管理
- 人工智能辅助药物服务企业制定与实施新质生产力项目商业计划书
评论
0/150
提交评论