运算符(operator)重载.ppt

上传人:zhu****ei 文档编号:5407831 上传时间:2020-01-28 格式:PPT 页数:19 大小:422.50KB
返回 下载 相关 举报
运算符(operator)重载.ppt_第1页
第1页 / 共19页
运算符(operator)重载.ppt_第2页
第2页 / 共19页
运算符(operator)重载.ppt_第3页
第3页 / 共19页
点击查看更多>>
资源描述
第12章运算符 operator 重载 什么是运算符重载运算符重载的基本方法运算符重载的一般规则用成员函数重载运算符用友元函数重载运算符算术运算符 关系运算符的重载 1 什么是运算符重载 1 问题的提出 在前面的章节中 我们学习了基本数据类型和运算符的有关内容 知道3 19 84 7 23 8等式子是成立的 假设已定义了日期类Date 复数类Complex现在定义几个对象 Dated1 2008 10 1 d2 2010 11 12 Complexc1 3 4 c2 4 5 问题 1 能否用d2 d1求出2008年国庆距离2010年广州亚运会 第16届 开幕的天数 2 能否用c1 c2求出两个复数之和 回答是否定的 事实上 C 预定义的 等一系列运算符的操作对象只能是基本数据类型 要让它们在用户自定义的数据类型 如 类 中也能类似使用 就需要对运算符赋予多种含义 这就是运算符重载 2 运算符重载的概念 对C 中的已有运算符赋予更多的含义 使之作用于特定类的对象 实现特定的功能 而且使用形式与基本数据类型的形式相同 要理解运算符重载的含义 需要把握其中的 变 与 不变 运算符不变 重载只能考虑C 现有的运算符 不允许用户定义新的运算符 操作数的范围有了变化 不再局限于基本数据类型 可以扩展到用户自定义的类型 即用户定义的类 所实现的功能也可以由用户来定义 运算符的使用形式不变 这样用户就能充分利用已有的知识 经验 见 符 猜义 节省了学习时间 提高了工作效率 对此 我们形象地称之为 旧瓶装新酒 2 运算符重载的基本方法 我们知道 9 2 4 9 0 2 0 4 5 为什么整数除法与浮点数除法的结果不一样呢 其实 在C 内部 任何运算都是通过函数来实现的 这些函数的形式为 operator运算符 形式参数表 称之为运算符函数之所以称为函数 是因为它们完全具备了函数的特征 函数名 圆括号 参数表 返回类型等函数的要素它一个不少 特殊之处是函数名是由关键字operator和运算符组合而成 1 运算符函数 计算表达式9 2 9 0 2 0分别被解释为调用函数 operator 9 2 operator 9 0 2 0 而operator int int 和operator double double 两个函数是重载关系 函数名相同 参数类型不同 功能也不同 故两个表达式的计算结果不同 事实上 C 中的每一个运算符都对应着一个或多个运算符函数 具体调用时 系统会根据实参的不同选择相应函数进行匹配 如果用户想让某一个运算符也能在自己定义的类对象中使用 并实现一定的功能 且不影响该运算符原先的使用 就必须对它的运算符函数进行重载 2 运算符函数重载的基本形式 运算符函数作为函数的一种 其声明 定义格式与普通函数差不多 只是函数的调用形式有点特别 函数声明 函数类型operator运算符 形参表 函数定义 函数类型operator运算符 形参表 对运算符的重载处理 函数调用 操作数1 运算符 操作数2 说明 加方括号的项表示可能省略 但至少有一个操作数 当然 运算符函数重载的具体格式还与所选用的函数形式 是成员函数还是友元函数 及操作数的个数 单目或双目 密切相关 后面详细介绍 3 运算符重载的一般规则 C 不允许用户自己定义新的运算符 只能对已有的运算符进行重载 C 允许重载的运算符 绝大多数运算符 双目算术运算符 取模 关系运算符 右移 C 允许重载的运算符 续 赋值运算符 空间申请与释放运算符 new delete new delete 其它运算符 函数调用 成员访问 成员指针访问 逗号 下标 不能重载的运算符只有5个 成员访问运算符 成员指针访问运算符 域运算符 sizeof 长度运算符 条件运算符 重载不能改变运算符操作数的个数 优先级和结合性 重载运算符的函数不能有默认的参数 重载运算符必须和用户自定义类型的对象一起使用 其参数至少有一个是类对象或对象引用 应当使重载运算符的功能类似于该运算符作用于标准数据类型时所实现的功能 对于运算符 对象赋值 和 取对象地址 的功能 系统已有默认定义 通常情况用户不需要重新定义 只有当对象间赋值涉及动态分配的指针 有可能出现多个对象的指针指向同一位置时 用户才需要自己重新定义 4 用成员函数重载运算符 主要是把握成员函数的类内声明 类外定义和函数调用等几个关键点 1 运算符函数 即成员函数 的类内声明格式 函数类型operator运算符 形参表 函数类型类名 operator运算符 形参表 对运算符的重载处理 2 运算符函数 即成员函数 的类外定义格式 3 运算符函数 即成员函数 的调用形式 对象 operator运算符 实参表 或对象运算符 操作数 这种形式更常用 说明 总是默认调用该成员函数的对象参与了其中的运算 因此 运算符函数隐含了一个参数 即this指针 它指向当前对象 所以 运算符函数的参数个数要比操作数的个数少一个 即双目运算符仅有一个参数 单目运算符无参数 请务必牢记这一点 说明 续 如果重载的运算符函数允许有参数 那么对该参数的类型并没有严格限定 既可以是自定义类型 也可以是基本数据类型 函数返回值类型的确定也是类似的 运算符函数的调用方式有两种 一种是普通成员函数的调用方式 另一种是表达式的形式 但后一种方式更直观 更常用 为了能在类外使用运算符表达式 通常把运算符函数设为public权限 等运算符只能用成员函数重载 设a bi和c di是两个复数 则它们的四则运规则如下 例7 1使用成员函数方法重载 运算符 5 用友元函数重载运算符 友元函数作为被访问类的 好友 它也有权访问被访问类的私有成员 因此 也可以用友元函数来重载运算符 用友元函数方法重载运算符与上一节介绍的用成员函数方法重载运算符相比 相同点 调用方式一样 即 操作数1 运算符 操作数2 至少有一个操作数 不同点 由于友元函数不属于类的成员 不存在当前对象参与运算的问题 因此 该运算符函数的参数个数与操作数的个数一样多 友元函数声明 定义 调用格式如下 1 运算符函数 即友元函数 的类内声明格式 friend函数类型operator运算符 形参表 参数个数为一个或两个 不可能为空 在函数名前不能加类名和 符号函数类型operator运算符 形参表 对运算符的重载处理 2 运算符函数 即友元函数 的类外定义格式 3 运算符函数 即友元函数 调用的基本形式 操作数1运算符操作数2 单目运算符只有一个操作数 还有前缀 后缀之分 说明 运算符函数参数的个数与操作数的个数相同 即双目运算符有两个参数 单目运算符只有一个参数 这一点很重要 再次强调一下 运算符的使用只能采用 操作数1运算符操作数2的基本形式 不允许像上一节那样写成对象 成员函数 实参表 形式 说明 续 插入运算符 只能用友元函数方法进行重载 例7 2使用友元函数方法重载 运算符 本讲小结 什么是运算符重载 运算符重载的实质就是运算符函数重载 运算符函数 重载的两种方法 重载的基本形式 运算符函数重载的一般规则 用成员函数重载运算符 运算符函数声明格式 定义格式 调用格式 用友元函数重载运算符 运算符函数声明格式 定义格式 调用格式 算术运算符 关系运算符的重载
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!