已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
运算符重载 运算符重载 运算符重载允许为运算指定用户定义的运算符实现 其中一个或两个操作数是用户定义的类或结构类型所有一元和二元运算符都具有可自动用于任何表达式的预定义实现 可通过在类或结构中设置operator声明来引入用户定义的实现 其优先级总是高于预定义运算符实现重载运算符便于程序员编写同时含有ADT和原生基本类型的中缀表达式 使程序更短 结构更清晰 复数类的四则运算 定义一个复数类Complex 将其多个实例进行四则运算 如何编程实现 staticvoidMain Complexc1 newComplex 1 2 Complexc2 newComplex 3 5 2 Complexc3 newComplex 4 23 result c1 c2 c3如何得到 Complexresult c1 Add c2 Sub c3 将Add Sub改成静态方法会不会更好些 Complexresult2 Complex Sub Complex Add c1 c2 c3 Console WriteLine result2 Print Console Read 在实现了需要的功能后 有没有一种让用户用更习惯 可读性 可编程性更好的方法来进行类似的运算呢 解决方案 运算符重载 可重载的运算符 一元运算符 truefalse二元运算符 publicclassComplex publicintreal publicintimaginary publicComplex publicComplex intreal intimaginary this real real this imaginary imaginary publicstaticComplexoperator Complexc1 Complexc2 returnnewComplex c1 real c2 real c1 imaginary c2 imaginary publicstaticComplexoperator Complexc1 Complexc2 returnnewComplex c1 real c2 real c1 imaginary c2 imaginary publicoverridestringToString return String Format 0 1 i real imaginary 二元运算符重载示例 注意函数原形 publicstaticvoidMain Complexnum1 newComplex 3 4 Complexnum2 newComplex 3 4 Complexnum3 newComplex 3 4 Complexsum num1 Add num2 Complexresult num1 num2 num3 Console WriteLine Firstcomplexnumber 0 num1 Console WriteLine Secondcomplexnumber 0 num2 Console WriteLine Thesumofthetwonumbers 0 sum Console WriteLine Theresult 0 result Console WriteLine num1 num2 Console Read 自动调用num1的ToString 默认 是比较两个对象的引用是否相同 publicstaticbooloperator Complexc1 Complexc2 if c1 real c2 real 对 重载一定要对 也进行重载 否则编译器报错 重写Equals和GetHashCode方法 警告1 ConsoleApplication3 Complex 定义运算符 或运算符 但不重写Object Equals objecto 和GetHashCode方法对于引用类型来说 Object Equals方法默认比较的是对象的相等性 当引用指向同一个对象的时候 它们是相等的 具有相同状态但指向不同对象的引用是不相等的 可对其进行改写 比较其内容是否相同对于值类型来说 Equals已经重写过以进行值的比较 GetHashCode 重载Equals必须重载GetHashCode这是一条编译器的rule 如果你重载了Equals不重载GetHashCode 编译器会发出警报GetHashCode需要返回一个Int32值 这个值的规律很简单 如果两个对象相同 则对象返回的HashCode必须相同 如果两个对象返回的HashCode不相同 则这两个对象必定不相同 两个对象不相同 不能保证hashCode不同这样就使得Equals的效率提高很多 因为GetHashCode通常成本比Equals小得多 publicstaticbooloperator Complexc1 Complexc2 if c1 real c2 real 整理一下 这样更好 publicoverrideboolEquals objectobj if objisComplex returnfalse returnthis Complex obj publicstaticbooloperator Complexc1 Complexc2 returnc1 Equals c2 publicstaticbooloperator Complexc1 Complexc2 return c1 Equals c2 publicoverrideintGetHashCode returnthis ToString GetHashCode 思考 如何实现复数的其他运算 加 减乘 除取反显示 自定义类型转换 现在 如果要实现int Complex怎么办呢 还有 complex intComplex doubledouble complexfloat ComplexComplex float 为每种运算定义重载太麻烦了 有更好的办法 自定义类型转换 用户自定义变换 在不希望进行隐式类型变换或者表达式不合法时 有必要对表达式进行用户自定义的类型变换 C 支持将用户自定义的ADT和内建的数据类型进行集成C 使用关键字implicit和explicit来修改单参数的静态方法 用户自定义的隐式变换 Implicit关键字用于声明用户定义的隐式类型转换运算符 可通过消除不必要的类型转换来提高源代码的可读classMyType publicstaticimplicitoperatorint MyTypem codetoconvertfromMyTypetoint MyTypex inti x implicitlycallMyType sMyType to intconversionoperator 用户自定义的显式变换 explicit关键字用于声明用户定义的显式类型转换运算符classMyType publicstaticexplicitoperatorMyType inti codetoconvertfrominttoMyType inti MyTypex MyType i int to MyTyperequirescast 为Complex类添加自定义类型转换 Complexnum1 newComplex 2 3 Complexnum2 newComplex 3 4 Complexnum3 4 5 Complexsum num1 3 num2 Console WriteLine Thesumofthe3numbers 0 sum 从实数到复数的自定义隐式转换 复数的实部 publicstaticimplicitoperatorComplex doubler returnnewComplex r 0 两次隐式转换 1 int double2 double Complex implicit改成explicit将会如何 显式自定义类型转换 publicstaticexplicitoperatorComplex doubler returnnewComplex r 0 publicstaticvoidMain Complexnum1 newComplex 2 3 Complexnum2 newComplex 3 4 Complexnum3 Complex 4 5 Complexsum num1 Complex 3 num2 Console WriteLine Thesumofthe3numbers 0 sum 更多运算符重载的例子 publicclassDoubOp publicDoubOp inti intj x i y j publicstaticDoubOpoperator DoubOpa a x a y returna publicstaticDoubOpoperator DoubOpa a x a y returna publicvoidPrint Console WriteLine this x this y intx y classTest publicstaticvoidMain DoubOpa newDoubOp 10 29 a Print a a Print a a Print 一元运算符重载示例 书中重载示例 分数 classFraction intnumerator intdenominator publicFraction intnumerator intdenominator this numerator numerator this denominator denominator publicstaticFractionoperator Fractionlhs Fractionrhs if lhs denominator rhs denominator returnnewFraction lhs numerator rhs numerator lhs denominator else intfirstProduct lhs numerator rhs denominator intsecondProduct rhs numerator lhs denominator intnewDenominator lhs denominator rhs denominator returnnewFraction firstProduct secondProduct newDenominator Simply publicoverridestringToString returnstring Format 0 1 this numerator this denominator 对分数进行约简publicFractionSimply intnum Math Abs this denominator 从大到小查找分子分母的最大公约数while num 1 if numerator num 0 publicstaticbooloperator Fractionlhs Fractionrhs Fractionf1 lhs Simply Fractionf2 rhs Simply if f1 numerator f2 numerator 更好的做法 交叉相乘若想等就相同 进一步 怎么比较分数的大小 思路方法一 先进行通分 在分母相同的情况下 由分子比较来得到分数的大小方法二 将2个分数都转换成double 然后比较double值注意重载了 必须同时重载 必须同时重载 分数 double并比较 publicstaticimplicitoperatordouble Fractionf return double f numerator f denominator publicstaticbooloperator Fractionlhs Fractionrhs doublel lhs doubler rhs returnl r 测试代码doubler f3 3 Console WriteLine 0 3 1 f3 r Console WriteLine 0 isgreaterthan 1 is 2 f1 f2 f1 f2 编译器还会要求你添加 的重载 更进一步问题 问题一 f2 3结果是什么 中间如何转换问题二 如何实现下列这些操作 double Fraction FractionFraction double Fraction 显式类型变换 测试代码Fractionf5 Fraction 3 5 f4 Console WriteLine 3 5 0 1 f4 f5 publicstaticexplicitoperatorFraction doubled Fractionf newFraction int d 100 100 Simply returnf 怎么判断应该用显式变换还是隐式变换 更好的做法 这里其实double Fraction是无损的 可implicitFraction double是有损的 应为Explicit 运算符重载注意点 不能被重载的运算符 成员访问 方法调用或 checked unchecked new typeof as和is运算符当重载一个二元运算符时 也会隐式重载相应的赋值运算符 若有 强制转换运算 如
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026散装玩具行业市场现状供需分析及投资风险评估研究报告
- 2026散装橡胶市场天然合成比例替代材料冲击及库存周期分析报告
- 2026年环保推广审计评估合同
- 2026年通信租赁AI 解决方案合同
- 海南省2025海南省中小企业发展服务中心考核招聘事业编制人员2人(第一号)笔试历年参考题库典型考点附带答案详解
- 浙江省2025浙江省经济和信息化厅部分直属事业单位招聘22人-统考笔试历年参考题库典型考点附带答案详解
- 浏阳市2025湖南长沙浏阳市事业单位招聘75人笔试历年参考题库典型考点附带答案详解
- 江阳区2025年上半年四川泸州市江阳区事业单位招聘157人笔试历年参考题库典型考点附带答案详解
- 2026-2030中国超市管理系统行业市场发展分析及发展前景策略与投资研究报告
- 2026年精神科患者隐私保护规定
- 幼儿园家长进课堂职业介绍课件
- 降低呼叫器使用率品管圈培训课件
- TSTIC 110069-2022 曳引驱动乘客电梯
- 广西阳朔国家森林公园生态旅游开发研究
- ZJ40CZK使用说明书模版
- 质性研究方法扎根理论课件
- 特种设备安全总监和安全员任命文件
- GB/T 42599-2023风能发电系统电气仿真模型验证
- Moldflow铜牌考试大纲
- 大金空调HD地暖VRV-U系列培训安装
- 水库调洪演算的原理和方法课件
评论
0/150
提交评论