




已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
运算符重载 主要内容 运算符重载的目的运算符重载概述重载的规则和限制如何重载运算符常见运算符的重载类型转换小结 classComplex public Complex floatr 0 floati 0 real r image i Complexadd constCompex voidmain inti 29 j 870 k floatx 2 6 y 2 4 k i j floatz x y Complexc1 3 2 4 6 c2 6 2 8 7 c3 c3 c1 add c2 运算符重载概述 运算符是一些系统预定义的函数名称 即用一些特定的符号表示各种运算 每个运算符对运算数据都有一定要求 C 中预定义的运算符的操作对象只能是基本数据类型 实际上 对于很多用户自定义类型 也需要有类似的运算操作 这就提出了对运算符进行重新定义 赋予已有符号以新功能的要求 运算符重载是对已有的运算符赋予多重含义 同一个运算符作用于不同类型的数据导致不同类型的行为 运算符重载的实质就是函数重载 在实现过程中 首先把指定的运算表达式转化为对运算符函数的调用 运算对象转化为运算符函数的实参 然后根据实参的类型来确定需要调用的函数 这个过程是在编译过程中完成的 运算符重载的规则和限制 不可以重载的运算符有 sizeof只能重载C 语言中已有的运算符 不可臆造新的 运算符重载后优先级和结合性都不会改变 不能改变操作数个数 单目只能重载为单目运算符 双目只能重载为双目运算符不能改变运算符对预定义类型数据的操作方式 即重载运算符时 其操作数中至少应该有一个是自定义类型 重载的运算符应保持其原有的基本语义 C 规定 只能重载为成员函数形式 作为提取和插入运算符使用时 只能用友元函数重载 运算符函数 定义运算符重载函数的一般格式 operator 函数体 type为函数返回值的类型 为要重载的运算符 arg为函数的形参表 operator是关键字 它与其后的运算符一起构成函数名 为了提高访问效率 运算符重载函数通常需要直接访问对象的私有或保护的数据成员 因此运算符重载函数通常为类的成员函数或者友元函数 重载为类的成员函数 双目运算符B如果要重载B为类的成员函数 使之能够实现表达式oprd1Boprd2 其中oprd1为A类对象 则B应被重载为A类的成员函数 形参类型应该是oprd2所属的类型 经重载后 oprd1Boprd2相当于oprd1 operatorB oprd2 前置单目运算符U如果要重载U为类成员函数 使之能够实现表达式Uoprd 其中oprd为A类对象 则U应被重载为A类的成员函数 无形参 经重载后 表达式Uoprd相当于oprd operatorU 后置运算符 和 如果要实现表达式oprd 或oprd 其中oprd为A类对象 那么运算符重载函数中要带一个整型 int 形参 经重载后 oprd 相当于oprd operator 0 oprd 相当于oprd operator 0 前增量与后增量的区别使用前增量时 对对象 操作数 进行增量修改 然后再返回该对象 参数与返回的是同一个对象使用后增量时 必须在增量之前返回原有的对象 后增量操作返回的是原有对象值 不是原有对象 原有对象已经被增量修改 重载为类的友元函数 此时运算所需的操作数都是通过函数的参数表来传递 在参数表中形参从左到右的顺序就是运算符操作数的顺序 双目运算符B重载后 ch18 2 表达式oprd1Boprd2等同于operatorB oprd1 oprd2 前置单目运算符B重载后 Boprd等同于operatorB oprd 后置单目运算符 和 重载后 此时函数的形参有两个 一个是类的对象 另一个是整型 int 形参oprdB等同于operatorB oprd 0 两种重载形式的比较 对双目运算符而言 成员运算符函数带有一个参数 而友元运算符函数带有两个参数 对单目运算符而言 成员运算符函数不带参数 而友元运算符函数带有一个参数 双目运算符一般可以被重载为友元运算符函数或成员运算符函数 但有一种情况必须使用友元函数 如加法运算 运算符函数调用形式 成员与友元运算符函数选取经验 对于单目运算符 建议选择成员函数 对于运算符 只能作为成员函数 对于运算符 作为提取和插入运算符使用时 只能用友元函数重载 常见运算符的重载 赋值运算符重载 注意 区别拷贝构造函数与赋值运算符 重载成员指针运算符 确保指向类对象的指针总是指向某个有意义的对象 有效内存地址 即创建一个指向对象的 智能指针 smartpointer 否则就返回错误信息 这样避免了对空指针或垃圾指针 garbagepointer 内容的存取 由于右操作数是对象的成员 该成员类型不能确定 所以 只能作为一元运算符重载 重载下标运算符 可增加数组检索的安全性 重载函数调用运算符 是唯一可带多个右操作数的运算符函数 重载 运算符解决指针悬挂 Classstring Public String char s Ptr newchar strlen s 1 Strcpy ptr s string Deleteptr Voidprint cout ptr endl String Voidmain Stringp1 book Stringp2 pen P1 p2 Cout p2 P1 print 重载new和delete ClassRect Public Rect intl intw Length 1 width w Voiddisp 0 Cout length width endl Void Rect operatornew size tsize Cout reloadnew endl Retrunmolloc size VoidRect operatordelete void p Cout reloaddeletefree endl Free p Voidmain Rect p newRect 5 9 P disp Deletep 重载 ostream Classcoord Intx y Public Coord inti 0 intj 0 X I y j Friendostream Classthree d Public Trhrr d inta intb intc X a y b z c Friendostream Istream 重载关系运算符 举例Time类的自增 时间上加若干秒 时间的比较 类型转换 系统预定义类型间的转换隐式类型转换 编译器根据需要自动对数据类型作转换 显式类型转换 强制转换 函数法 类类型与系统预定义类型间的转换通过带构造函数进行类型转换 只能实现从基本类型向自定义类类型的转换 参数的类型即要转换的类型通过类类型转换函数进行类型转换operator类型名 可以把源类类型转换成另一种目的类型 不用参数从某个类到另外一个类的转换 使用转换函数 要使用参数 转换函数 对一个类建立健立隐式转换规则需要构造一个转换函数 该函数作为类的成员 在以把该类的对象和其他数据类型的对象进行相互转换 声明了转换函数 就告诉了编译器 当根据句法判定需要类型转换时 就调用该函数 有两种转换函数 一种是转换构造函数 另一种是成员转换函数 需要采用哪种转换灵敏取决于转换的方向 转换构造函数 当一个构造函数公有一个参数 且该参数是不同于该类的一个数据类型时 这样的构造函数就叫转换构造函数 转换构造函数把别的数据类型的对象转换为该类的一个对象 和其他构造函数一样 如果声明类对象的初始化表同转换构造函数的参数表相匹配 该函数就会被调用 当在需要该类的地方使用了别的数据类型 编译器就会调用转换构造函数进行转换 成员转换函数 成员转换函数把该类的对象转换为其他数据类型的对象 声明中要加operator operatorlong Classname operatorlong 转换构造函数举例1 include includeusingnamespacestd includeclassDate intyear month day public Date time t 转换构造函数voiddisplay 显示日期的成员函数voidDate display charyr 5 if year 10 sprintf yr 0 d year elsesprintf yr d year cout yr month day endl 构造函数转换函数Date Date time tnow tm tim localtime 转换构造函数举例2 classCustomDate public intda yr CustomDate intd 0 inty 0 da d yr y voiddisplay cout endl yr da classDate intmonth day year public Date intm 0 intd 0 inty 0 month m day d year y 构造函函数转换函数Date constCustomDate 构造函数转换函数 Datedys month day day dys month elsebreak month 成员转换函数 CustomDate Date Date operatorCustomDate CustomDatecd day year for inti 0 i month 1 i cd da cd da dys i returncd intmain Datedt 11 17 2011 CustomDatecd cd dt 将Date转换CustomDatedt display cd display Datedt2 dt2 cd dt2 display return0 成员转换函数举例 include includeusingnamespacestd Date类声明classDate intyear month day public Date inty intm intd year y month m day d 成员转换函数operatorlong voiddisplay cout endl year month day 成员转换函数Date operatorlong staticintdys 0 31 28 31 30 31 30 31 31 30 31 30 31 longdays year 1900 days days 365 days days year 4 for inti 1 i month 1 i days days dys i days days day returndays intmain Datexmas 1997 12 25 longsince xmas cout since days endl return0 调用转换构造的情形 参数传递初始化返回值表达式语句 通过构造函数进行类型转换 Classexample Public Example int Voidprint Private Intnum Example example intn Num n Cout Intializeingwith num endl Voidexample print Cout num num endl Voidmain Examplex example 3 X print Exampley 6 y print Y 8 y print 通过类类型转换函数进行类型转换 Classcomplex Operatorfloat Returnreal Operatorint Returnint real Voidprint Cout real imag endl Private Floatreal imag Voidmain Complexa 2 2 4 4 A print Cout flaot9a 0 5 endl Complexb 4 6 B print Cout int b 2 endl 通过类类型转换函数进行隐式转换 Classcomplex Complex inti 0 real imag i 2 Operatorint Returnint real Voidprint Cout real imag endl Private Floatreal imag Voidmain Complexa1 1 2 a2 3 4 a1 print A2 print Complexa3 A3 a1 a2 A3 print 小结 使用运算符重载可以使程序易于理解并易于对对象进行操作 但应注意不要改变优先级和结合性 不能改变运算符操作数的数量 也不能发明新运算符 如果在类中没有说明本身的拷贝构造函数和赋值运算符 编译程序将会提供 但它们都只是对对象进行成员浅拷贝 在前增量和后增量运算符定义中 使用int形参只是为了标志前后有别 没有其它作用 拷贝构造函数用已存在的对象创建一个相同的新对象 而赋值运算符把一个对象的成员变量值赋予一个已存在的同类对象的同名变量 this指针指向当前的对象 它是所有成员函数的不可见
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新加坡协议书离婚
- 质量索赔协议书
- 羊测定协议书
- 佣金协议书 英文
- 父母购房协议书
- 第2节 摇一摇听单词教学设计-2025-2026学年初中信息技术(信息科技)第二册粤教版(广州)
- ping用的什么协议书
- 房产 代持协议书
- 个国家协议书
- 追赠抚养协议书
- 天津市普通高中学业水平考试英语词汇表
- Wagstaff低液位自动控制铸造-课件
- 锂电池安全培训课件
- 妇科护士进修汇报护理课件
- 消防验收竣工报告
- 高考英语1600个必考高频词汇
- 法院调令申请书范本
- GB/T 23451-2023建筑用轻质隔墙条板
- 驻足思考瞬间整理思路并有力表达完整版
- 第二章 盛唐诗歌边塞诗派公开课一等奖课件省赛课获奖课件
- 滚筒干燥机设计毕业设计
评论
0/150
提交评论