C语言5重载ppt课件.ppt_第1页
C语言5重载ppt课件.ppt_第2页
C语言5重载ppt课件.ppt_第3页
C语言5重载ppt课件.ppt_第4页
C语言5重载ppt课件.ppt_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C 程序设计 第五章重载 内容提要 函数重载运算符重载类型转换 5 1函数重载 关于函数重载 在函数部分已作了简单介绍 本章进一步详细介绍 函数重载指的是两个以上的函数 取同一个名字 只要使用不同类型的参数或参数个数不同 编译器便知道在什么情况下该调用哪个函数 例5 1 若希望进行两个整数相加 两个实数相加 两个浮点数相加 两个字符串相加 要用四个函数来实现 如果使用C语言编程 必须给四个函数起四个不同的函数名 而C 支持函数重载 因此只需给这四个函数取一个相同的名字即可 将来通过参数的类型来决定调用哪一个具体函数 减少了用户调用函数的麻烦 程序 1 构造函数重载 前面介绍构造函数时 曾经讲过在定义构造函数时可定义多个 只是它们的参数的个数和类型取的不同 这实际就是构造函数的重载 对构造函数的重载 可使系统有几个不同的途径对对象初始化 2 类成员函数重载 在类中除了构造函数可以重载外 一般的成员函数也可以重载 其重载原则和构造函数相同 重载函数之间靠包含的参数的类型与个数不同进行区分 3 类以外的一般函数重载在函数部分已作过介绍 5 2运算符重载 运算符重载就是赋予已有的运算符多重含义 C 中通过重新定义运算符 使它能够用于特定类的对象执行特定的功能 例如 通过对 运算符的重新定义 使它们可以完成复数 分数等不同类的对象的加减乘除运算操作 从而增强了C 语言的处理能力 1 运算符重载概述 C 中预定义的运算符的操作对象只能是基本数据类型 实际上 对于很多用户自定义类型 也需要有类似的运算操作 这就提出了对运算符进行重新定义 赋予已有符号以新功能的要求 运算符重载的实质就是函数重载 在实现过程中 首先把指定的运算表达式转化为对运算符函数的调用 运算对象转化为运算符函数的实参 然后根据实参的类型来确定需要调用的函数 这个过程是在编译过程中完成的 C 中大多数运算符都能重载 只有少数运算符不能重载 可以重载的运算符 newdelete不能重载的运算符 运算符重载的规则如下 1 C 中的运算符除了少数几个以外 全部可以重载 而且只能重载已有的这些运算符 2 重载之后运算符的优先级和结合性都不会改变 3 不能改变运算符原有的语法结构 不能改变运算符原有的操作数个数 4 不可臆造新的运算符 5 运算符重载是针对新类型数据的实际需要 对原有运算符进行适当的改造 一般来讲 重载的功能应当与原有功能相类似 不能改变原运算符的操作对象个数 同时至少要有一个操作对象是自定义类型 2 用成员函数重载运算符 在C 中 运算符的重载实际上是一种函数调用的形式 用成员函数重载运算符就是将运算符重载定义成一个类的成员函数的形式 1 用成员函数重载运算符的语法 在类定义中声明运算符函数operator 与一般的成员函数相似 在类外对其进行定义operator 重载运算符的使用 使用起来就像原运算符一样方便 2 说明 其中 指定了重载运算符的返回值类型 operator是定义运算符重载函数的关键词 给定了要重载的运算符名称 是C 中可重载的运算符 形参表中给出重载运算符所需要的参数和类型 对于运算符重载为友元函数的情况 还要在函数类型说明之前使用friend关键词来说明 当运算符重载为类的成员函数时 函数的参数个数比原来的运算数个数要少一个 后缀 除外 一般来讲 单目运算符最好重载为成员函数 而双目运算符则最好重载为友元函数 运算符重载的主要优点就是允许改变使用于系统内部的运算符的操作方式 以适应用户新定义类型的类似运算 includeclassComplex doublerpart doubleipart public Complex doublerp 0 0 doubleip 0 0 rpart rp ipart ip Complexoperator Complexc voidprint ComplexComplex operator Complexc Complextemp temp rpart rpart c rpart temp ipart ipart c ipart returntemp voidComplex print cout0 cout if ipart 0 cout ipart i n intmain Complexa 1 1 2 2 b 3 3 4 4 c d d a operator b 显式调用c a b 隐式调用c print d print return0 程序中出现的表达式a b解释为a operator b 当前对象作为左操作数 3 用友元重载运算符 1 用友元函数重载运算符的语法 在类定义中声明运算符函数friendoperator 与一般的成员函数相似 在类外对其进行定义friendoperator 重载运算符的使用 用友元函数定义的重载运算符和用成员函数定义的重载运算符相同 2 说明 为友元函数重载运算符的参数表填写操作数时 要注意友元函数是不属于任何类的 它没有this指针 这与成员函数不同 即当重载为类的友元函数时 参数个数与原运算数的个数相同 includeclassComplex private doublerpart doubleipart public Complex doublerp 0 0 doubleip 0 0 rpart rp ipart ip friendComplexoperator Complexa Complexb voidprint Complexoperator Complexa Complexb Complextemp temp rpart a rpart b rpart temp ipart a ipart b ipart returntemp voidComplex print cout0 cout if ipart 0 cout ipart i n intmain Complexa 1 1 2 2 b 3 3 4 4 c d c a b 隐式调用d operator a b 显式调用c print d print return0 4 和 的重载 类的单目运算符可重载为一个没有参数的非静态成员函数或者带有一个参数的非成员函数 参数必须是用户自定义类型的对象或者是对该对象的引用 在C 中 单目运算符有 和 它们是变量自动增1和自动减1的运算符 在类中可以对这两个单目运算符进行重载 如同 和 运算符有前缀 后缀两种使用形式 和 重载运算符也有前缀和后缀两种运算符重载形式 以 重载运算符为例 其语法格式如下 operator 前缀运算operator int 后缀运算 使用格式 使用前缀运算符的语法格式如下 使用后缀运算符的语法格式如下 使用运算符前缀时 对对象 操作数 进行增量修改 然后再返回该对象 所以前缀运算符操作时 参数与返回的是同一个对象 这与基本数据类型的运算符前缀类似 返回的也是左值 使用运算符后缀时 必须在增量之前返回原有的对象值 为此 需要创建一个临时对象 存放原有的对象 以便对操作数 对象 进行增量修改时 保存最初的值 运算符后缀操作时返回的是原有对象值 不是原有对象 原有对象已经被增量修改 所以 返回的应该是存放原有对象值的临时对象 单目运算符重载classX Xoperator includeclasscoord intx y public coord inti 0 intj 0 x i y j coordoperator voidprint coordcoord operator x y return this voidcoord print cout x x y y endl intmain coordob 10 20 ob print ob 隐式调用ob print ob operator 显式调用ob print return0 5 运算符 和 的重载 运算符 是函数调用运算符 运算符 是下标运算符 这两个运算符在重载定义时 不能用友元函数重载 只能采用成员函数重载 函数调用运算符 重载的一般形式为 typeclass name operator 形参表 下标运算符 函数重载的一般形式为 typeclass name operator arg 其中arg为该重载函数的参数 重载了的下标运算符只能且必须带一个参数 该参数给出下标的值 重载函数operator 的返回值类型type是引用类型 6 new和delete的重载 C 提供了new与delete两个运算符用于内存管理 但有些情况下用户需要自己管理内存 为自己所定义的类体系建立一种新的动态内存管理算法 以克服new与delete的不足 这就要重载运算符new与delete 使其按照要求完成对内存的管理 new和delete只能被重载为类的成员函数 不能重载为友元 而且 无论是否使用关键字static进行修饰 重载了的new和delete均为类的静态成员函数 new和delete的重载形式 运算符new重载的一般形式为 void class name operatornew size t new重载应返回一个无值型的指针 且至少有一个类型为size t的参数 若该重载带有多于一个的参数 则其第一个参数的类型必须为size t 运算符delete重载的一般形式为 voidclass name operatordelete void delete至少有一个类型为无值型指针的参数 该重载最多可以带有两个参数 若有第二个参数 则其第二个参数的类型必须为size t 7 赋值运算符的重载 赋值运算符 的原有含义是将赋值号右边表达式的结果拷贝给赋值号左边的变量 通过运算符 的重载将赋值号右边对象的私有数据依次拷贝到赋值号左边对象的私有数据中 在正常情况下 系统会为每一个类自动生成一个默认的完成上述功能的赋值运算符 当然 这种赋值只限于由一个类类型说明的对象之间赋值 如果一个类包含指针成员 采用这种默认的按成员赋值 那么当这些成员撤消后 内存的使用将变得不可靠 include includeclassstring char ptr public string char s ptr newchar strlen s 1 strcpy ptr s string deleteptr voidDisplay cout ptr endl string 执行p2 p1之后 5 3类型转换 类型转换就是将一种类型的值转换为另一种类型的值 在C 中 类被看作是用户自己定义的抽象数据类型 它也可以像系统预定义的类型那样进行转换 类型转化有两种形式 一种是标准类型转换 它是一种隐式类型转换 另一种是显式类型转换 它包括强制转换法和函数法 1 一般数据类型间的转换 1 标准类型转换若使用标准类型转换用的是隐式转换 有如下规则 当char或shor类型对象与int对象进行运算式 将它们都转换为int类型 当两个操作对象类型不一致时 在进行运算之前 级别低的自动转换为级别高的类型 在赋值表达式E1 E2的情况下 赋值运算符右端E2的结果值需转换为E1类型后进行赋值 2 显式类型转化 强制转换法 格式为 类型名 表达式函数法 格式为 类型名 表达式 2 通过构造函数进行类类型转换 在实际应用中 当类定义中提供了单个参数的构造函数时 该类便提供了一种将其它数据类型的树枝或变量转换为用户所定义数据类型的方法 因此 可以说单个参数的构造函数提供了数据转换的功能 例5 7 include stdafx h include iostream h classA public A m 0 A doublei m i voidprint cout m endl private doublem voidmain Aa 5 a 10 a print 说明 该程序中 赋值语句a 10 中 赋值号两边数值10和对象a是两个不相容的数据类型 可却能顺利通过编译 并正确输出结果 其主要原因是由于单参数的构造函数 编译系统先通过标准数据类型转换 将整型数值10转换double型 然后 再通过类中定义的单参数构造函数double型数值转换为A类类型 最后把它赋值给a 这些转换都是自动隐式完成的 3 类类型转换函数 又称为类型强制转换成员函数 它是类中的一个非静态成员 它的定义格式 class public operator 这个转换函数定义了由到之间的映射关系 通过转换函数将所标识的类类型转换成为所指定的类型 例5 8 include stdafx h include iostream h classRational public Rational intd intn den d num n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论