已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第9章运算符重载 C 允许用户根据所创建的类来定义运算符的含义 该过程称为运算符重载 通过重载运算符 可以扩展运算符在类中的作用 运算符重载的优点是 它允许将新的类类型无缝隙地整合进用户自己的编程环境中 这种类型扩展是面向对象语言包括C 的一种重要功能 本章将详细讲解运算符重载的使用 9 1什么是运算符重载 运算符重载是根据用户所创建的类来定义运算符的含义 这样运算符的作用完全由用户决定 同时类和类之间的运算符含义可以不同 换句话说 通过运算符的重载改变了运算符运算的规则 可以扩展运算符在类中的作用 通常情况下 运算符只允许数与数 数与数据和数据与数据之间的运算 通过运算符的重载 不同类型的对象都可以进行运算 如下图所示 在教师类Teacher中 通过教师级别的增加 其相应属性也会改变 一般的运算符不能满足这种运算 所以就必须重新定义运算符的规则 这样就产生了运算符的重载 它能让我们更方便的使用不同的运算符 9 2如何重载运算符 运算符重载是一个特殊的方法 其语法形式如下图所示 其中 运算符重载方法的访问修饰符必须是public 该方法必须是静态方法 public和static满足一个 就可以了 operator是运算符重载的关键字 op表示要重载的运算符 参数列表表示调用该方法所要传递的参数 示例9 1 以下代码演示对Team类实现加号运算符的重载 publicstatic是修饰符 Team表示运算的结果类型 operator是运算符重载的关键字 oper1和oper2是Team类类型的两个参数 注意 该参数类型必须是对象或者结构 如果不是 会提示如下错误信息 运算符的参数必须是包含类型 9 2 1一元运算符重载 一元运算符只有一个操作数 常见的一元运算符包括非运算 自增运算符 和自减运算符 一元运算符重载语法如下图所示 示例9 2 定义了一个银行账号类Program 通过将非运算符 重载 实现将银行账号金额清空的功能 其中 参数必须是对象或者结构类型 否则会提示错误信息 一元运算符的参数必须是包含类型 示例9 3 定义了一个银行卡类Program 通过自增运算符重载 实现银行卡升级的功能 示例9 4 定义了一个人年龄的类Program 通过自减运算符重载 实现这个公司的级别的查看 重载自增与自减运算符 只需要返回自增或自减的值 但不改变主调对象 其中 应特别主意前缀和后缀的区别 9 2 2二元运算符重载 二元运算符的重载与一元运算符的重载类似 常见的二元运算符有加法 减法 二元运算符重载格式如下图所示 示例9 5 介绍通过定义类Program 利用重载二元运算符加法 运算将整型值加到Program类型对象的各个坐标上 实现坐标轴的平移 示例9 5中将运算符 重载 给原本的 赋予另一层含义 即将各个x轴 y轴 z轴都相加 实现了坐标轴的平移 9 3关系运算符重载 关系运算符 如 或 也可以重载 重载关系运算符返回true或false值 重载后的关系运算符可以用于条件表达式 关系运算符重载必须对他们成对重载 例如 如果重载 运算符 那么就必须重载 运算符 成对重载的运算符有 和 和 关系运算符重载格式如下图所示 示例9 6 利用重载 判断三个对象的大小 输出最大对象 在该例中 返回数据类型必须是bool 否则会提示错误 错误信息如下 无法将类型 bool 隐式转换为 重载关系运算符 Program 而且 如果重载 运算符 否则编译器会报错 错误信息如下 运算符 重载关系运算符 Program operator 重载关系运算符 Program 重载关系运算符 Program 要求也要定义匹配的运算符 9 4重载true和false 关键字true和false也能够作为一元运算符进行重载 一旦给一个类实现了true和false的重载 用户就能够使用该类的对象控制if while for和do while语句 或者在问号表达式中使用它们 通用格式如下图所示 其中 true和false运算符必须成对重载 不能只重载其中一个 两个方法的返回值都是bool类型 示例9 7 演示如何在Program类中实现true和false的重载 只要至少有一个坐标不为0 那么Program对象就为真 如果所有坐标都是0 那么对象为假 注意 1 true和false可以作为两个操作符被重载 并且如果重载true那么必然需要重载false 否则编译器会报错 错误信息如下 运算符 重载true和false Program operatortrue 重载true和false Program 要求也要定义匹配的运算符 false 2 当使用 操作符时首先调用false操作符先判定是否为假 当使用 操作符的时候首先调用true操作符先判定是否为真 9 5逻辑运算符重载 逻辑运算符 和 通常 可以重载的运算符有 和 但是通过遵循一些规则 我们仍然能够利用 和 短路运算符简化运算的优点 9 5 1逻辑运算符重载的简单方式 重载 和 运算符 其返回bool类型的结果 重载 运算符通常也返回bool类型的值 逻辑运算符重载格式如下图所示 示例9 8 为Program类型的对象重载 和 逻辑运算符 与前面的示例一样 只要至少一个坐标不为0 就认为Program对象为真 如果3个坐标都为0 那么该对象为假 9 5 2使用短路运算符 如果要使用 和 这两个短路运算符 那么就必须遵循下面4个规则 类必须重载 和 运算符 重载的 和 运算符方法的返回类型必须是重载运算符的类的类型 每个参数必须是对重载运算符的类对象的引用 必须为该类重载true和false运算符 当这些条件都满足时 短路运算符就自动变为可用 示例9 9 实现了Program类中 和 运算符的重载 以使短路运算符 和 可用 9 6转换运算符 转换运算符允许将类的对象转换成另一种类型 转换运算符有助于将类类型完整地集成到C 的编程环境中 因为它允许类的对象自由地和其他类型的数据混合使用 只要定义了这些类型的相应转换即可 转换运算符有两种形式 隐式和显式 其通用形式如下图所示 其中 public和static是规定的修饰符 implicit是隐式转换的关键字 explicit是显式转换的关键字 target type为转换的目标类型 source type是转换的源类型 value是转换后类对象的值 示例9 10 以下代码演示Program类型的隐式转换 隐式的指定转换运算符会自动调用转换过程 显式的指定转换运算符 将在使用强制类型转换时调用转换过程 对于相同目标类型和源类型的转换 不能同时定义隐式转换运算符和显式转换运算符 示例9 11 将Program类型的对象转换成整数类型 来实现三维坐标的相加 示例9 12 将前面的程序修改为使对象显式的转换为int类型 其中 因为转换运算符是显式的 所以必须显式地强制执行int类型的转换 例如 在下面的语句中 i int a 如果去除强制类型转换 程序编译将报错 错误信息如下 无法将类型 显式转换 Program 隐式转换为 int 存在一个显式转换 是否缺少强制转换 对于转换运算符 有如下的限制条件 转换的目标类型或源类型必须是在其中声明转换的类 例如 不能重新定义从double类转到int类型的准换不能定义以object对象作为目标类型或源类型的转换 对同一个源类型和目标类型的转换 不能同时定义它的显式和隐式转换 不能定义从基类到派生类的转换 不能定义从接口到其他类型或从其他类型到接口的转换 9 7注意问题 重载运算符是也有一些限制 首先 不能改变任何运算符的优先级 其次虽然运算符方法可以选择忽略操作数 但不能修改运算符所要求的操作数量 另外有一些运算符不能重载 9 7 1重载后运算符的优先级 运算符重载后也是有优先级的 下表将展示C 中运算符重载后的优先级 一般来说 不使用优先级来获取计算结果 采取括号 来制定运算符的运算顺序 可以是代码更整洁 避免潜在的错误 示例9 13 演示了重载后运算符的优先级 在该例中 程序在运行时首先重载 运行结果为1 其次重载 运行结果2 最后运行表达式 输出结果 9 7 2不能重载的运算符 运算符 可以分为一元 二元和三元运算符 在它们中有一些可以重载 但还有一些并不能 不可以重载的运算符包括 赋值运算符和复合赋值运算符 和 等 条件运算
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医疗数据安全区块链隐私保护方案
- 江西省临川2026届高二上生物期末质量跟踪监视模拟试题含解析
- 医疗数据安全传输:区块链加密技术
- 医疗数据安全中的访问控制策略
- 医疗数据安全与医疗数据安全保障
- 医疗数据安全与AI协同的区块链应用模式
- 医疗数据可控性的区块链访问控制模型构建
- 肿瘤防护指导课件
- 医疗数据区块链共享的隐私保护策略
- DB46-T 719-2025 古树名木养护管理技术规范
- 光谷融媒体中心公开招聘工作人员备考考试试题及答案解析
- 2025下半年贵州遵义市市直事业单位选调56人考试笔试备考试题及答案解析
- 门窗合同范本的模板
- 深度解析(2026)《DLT 2121-2020高压直流输电换流阀冷却系统化学监督导则》
- 2025北京日报社招聘10人参考笔试题库及答案解析
- GB/T 7928-2025地铁车辆通用技术条件
- 2025-2026学年高一上学期期中模拟地理试卷 (上海专用)
- 财务税务合规审查操作手册
- DGTJ08-2065-2020 住宅二次供水技术标准 附条文说明
- 2023年开封辅警招聘考试真题含答案详解(完整版)
- 2025年注册监理工程师房建工程延续继续教育试卷及答案
评论
0/150
提交评论