C++ 第五章 成员函数_第1页
C++ 第五章 成员函数_第2页
C++ 第五章 成员函数_第3页
C++ 第五章 成员函数_第4页
C++ 第五章 成员函数_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

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

文档简介

面向对象程序设计 第五章成员函数 成员函数的定义和调用 函数的参数 内联函数 运算符和表达式 构造函数和析构函数 静态成员函数 函数的重载 5 1成员函数的定义和调用 对象 一 成员函数的定义格式 5 1成员函数的定义和调用 class类名 public private protected classCircle private doublex y r public voidprint voidset doublex1 doubley1 doubler1 doublearea return 3 14 r r doublelenth return 2 3 14 r voidCircle print cout 圆心 x y endl cout 半径 r endl voidCircle set doublex1 doubley1 doubler1 x x1 y y1 r r1 代码较少的成员函数可直接在类中进行定义 代码较多的成员函数可在类中进行原型的说明 在类外进行定义 在类外进行定义成员函数时要加上所属的类名 二 成员函数的调用 5 1成员函数的定义和调用 一般有两种形式 对象名 函数名 实参1 实参2 对象指针 函数名 实参1 实参2 例如 voidmain Circlemycircle cout Theareaofcircle mycircle area 二 成员函数的调用 一般有两种形式 对象名 函数名 实参1 实参2 对象指针 函数名 实参1 实参2 例如 voidmain Circle pcircle coutarea 5 1成员函数的定义和调用 一 为什么要引进内联函数 includeintisnumber char voidmain charc while c cin get n if isnumber c cout 0 includeintisnumber char voidmain charc while c cin get n if ch 0 5 2内联函数 二 内联函数的定义 inline类型说明符被调用函数名 形参表 内联函数具有一般函数的特性 它与一般函数的不同之处仅在于函数调用的处理 内联函数在调用时 是将调用表达式用内联函数体来替换 5 2内联函数 includeinlineintisnumber char voidmain charc while c cin get n if isnumber c cout 0 内联函数中最好不要含有复杂的结构控制语句 如switch和循环语句 递归函数不能用作内联函数 内联函数只适用于行数较少的函数 内联函数的定义必须出现在第一次被调用之前 所有在类内部定义的函数都是内联函数 二 内联函数的定义 5 2内联函数 设计一个程序 比较直接运行语句 i j i j 与运行内联函数和运行外部函数之间的所耗时间 三者分别运行100000000次 i与j循环变化 析 clock 函数在time h中声明 如果除以常数CLK TCK 则为秒数 CLK TCK一般内定为1000 表示每1000个时钟单位等于1秒 它通常用来计算系统运行所消耗的准确时间 练习 一 隐式类型转换 5 3运算符和表达式 其转换过程是由系统按照一定的转换规则自动完成的 char short int longint unsignedchar unsignedshort unsignedint unsignedlong float double longdouble 一 隐式类型转换 5 3运算符和表达式 inta 5 floatx a 2 inta 5 floatx float a 2 计算结果x值为2 0 计算结果x值为2 5 intival 5 ival 3 54 3 计算结果x值为6 二 显式类型转换 5 3运算符和表达式 强制转换法的格式为 类型名 表达式 如 int x 注 int x后 x仍保持原类型 只是得到了一个int型的中间变量 值为x的整数部分 int x y的意思为将x转化为整型 再与y相加 下面程序的功能为 从键盘读入若干整数 计算并输出所读入数中正整数的平均值 忽略输入的负数 当输入的值为0时 结束输入 比如从键盘输入以下数 1 4 23460则输出内容为 Theaverageofnon negativenumberis3 5 仔细阅读程序 填充其中没有完成的部分 注意 1 输入数中的负数被忽略 2 输出的平均值不能省略小数部分 A voidmain intiValue 当前输入的整数值intsum 0 输入的正整数的和B 统计输入的正整数的个数while 1 cin iValue if C continue if iValue 0 D sum iValue 计算和num cout nTheaverageofnon negativenumberis E A include iostream h Bintnum 0CiValue 0DbreakE1 0 sum num float sum num double sum num 5 4函数的参数 值传递 值调用 引用传递 引用调用 传值传地址 一 C 函数参数传递机制 includevoidswap int int voidmain inta 3 b 8 cout a a b b endl swap a b cout afterswapping n cout a a b b endl voidswap intx inty inttemp x x y y temp a 3 b 8afterswapping a 3 b 8 includevoidswap int int voidmain inta 3 b 8 cout a a b b endl swap a 3 b 8afterswapping a 8 b 3 调用函数的实参要用变量名 将实参变量名赋给形参的引用 相当于在被调用函数中使用了实参的别名 如swap a b 在函数原型中该参数类型后面加上 如 voidswap int 5 4函数的参数 二 引用作函数的参数 includevoidswap int a 3 b 8afterswapping a 8 b 3 按值调用 实参为变量名 形参为变量名 传址调用 实参为地址值 形参为指针 引用调用 实参为变量名 形参为引用名 比较三种调用方式 二 引用作函数的参数 5 4函数的参数 当一个函数返回引用时 它可以直接进行计算 5 4函数的参数 三 引用作函数返回值 函数调用本身也可作为变量和对象来使用 这是引用概念在C 程序设计中非常重要的应用 5 4函数的参数 C 语言允许在函数被说明或定义时给一个或多个参数指定默认值 如 intfun1 inta intb 5 intc 8 四 带默认参数的函数 5 4函数的参数 说明 在设置默认值时要注意以下事项 指定默认值时要从参数表的右端开始 在指定了默认值的参数的右边不允许出现没有指定默认值的参数 在函数调用时 给定的实参值将取代参数的默认值 没有给定实参值的将使用参数的默认值 四 带默认参数的函数 voidf0 floata intb charc voidf1 floata intb charc B voidf2 floata intb 4 charc B voidf3 floata 1 intb 4 charc B floata 2 1 intb 5 charc C f3 a b c 调用2 1 5 Cf3 a b 调用2 1 5 Bf3 调用1 4 Bf1 a b 调用2 1 5 Bf0 a b c 调用2 1 5 Cf0 a b f1 a f2 错误 5 4函数的参数 5 4函数的参数 说明 在设置默认值时要注意以下事项 不允许在函数原型和函数定义中 同时指定默认值 四 带默认参数的函数 voidf1 floata intb charc B voidf1 floata intb charc B 5 5静态成员函数 补充 静态数据成员 includeclassTC private intm staticintn public voidset m 0 m n voiddisp cout m n endl intTC n 0 voidmain TCA B A set B set A disp B disp 执行结果 1 21 2 5 5静态成员函数 二 定义静态成员函数的格式 static返回值类型成员函数名 参数列表 一 静态成员函数作用当类的对象不存在时 只有静态成员函数可以访问类的静态数据成员 5 5静态成员函数 三 静态成员函数中引用的数据 直接引用 类中的静态数据成员 全局数据变量 用const关键字说明的常量 2 间接引用类中的非静态数据成员 intex 6 全局变量constintcx 7 常量classMyclass public staticintf 1 Myclassm 静态成员函数intx 非静态数据成员staticinty 静态数据成员 intMyclass y 8 intMyclass f 1 Myclassm m x 9 returny ex cx m x 函数的调用结果是 返回值 30 直接引用 类中的静态数据成员 全局数据变量 用const关键字说明的常量 2 间接引用类中的非静态数据成员 5 5静态成员函数 四 静态成员函数的调用 方法 类名 静态成员函数名方法 对象名 静态成员函数名方法 对象指针 静态成员函数名 5 6函数的重载 函数重载是指同一个函数名可以对应着多个函数的实现 即支持多个不同的函数采用同一名字 intiabs inti longlabs longl doubledabs doubled C语言 intabs inti longabs longl doubleabs doubled C 语言 要求函数名唯一 C 的函数如果在返回类型 参数类型 参数个数 参数顺序上有所不同 则认为是不同的 但重载函数如果仅仅是返回类型不同 则是不够的 例如下面的声明是错误的 说明 voidfunc int intfunc int 5 6函数的重载 举例说明参数类型不同的重载函数的实现 例1 includeintabs intx returnx 0 x x floatabs floatx returnx 0 x x voidmain cout 10的绝对值是 abs 10 endl cout 2 5的绝对值是 abs 2 5 endl 5 6函数的重载 举例说明参数个数不同的重载函数的实现 例2 includeintmin inta intb returna b a b intmin inta intb intc intt min a b returnmin t c intmin inta intb intc intd intt1 min a b intt2 min c d returnmin t1 t2 voidmain cout min 13 5 4 9 endl cout min 2 8 0 endl 不能用typedef定义的类型名来区分重载函数声明的参数 例如下面的代码实际上是同一个函数 说明 typedefINTint voidfunc intx voidfunc INTx error 5 6函数的重载 同名的重载函数应该具有相同的功能 如果定义一个abs 函数而返回的却是一个数的平方根 则程序的可读性受到破坏 说明 5 6函数的重载 重载函数将实参与所有被调用的重载函数的形参相比较 说明 若找到严格匹配的 则调用此函数再通过内部数据转换查找匹配的最后是通过用户所定义的强制转换来查找匹配的 5 6函数的重载 例 voidprint double voidprint int voidmain print 1 匹配voidprint int print 1 0 匹配voidprint double print a 匹配voidprint int 5 6函数的重载 包含缺省参数时 可能导致重载函数二义性 说明 例 不能把函数intmax inta intb 10 intc 20 重载为下列形式 intmax inta intmax inta intb intmax inta intb intc 5 6函数的重载 关于函数重载的内部实现 C 用名字粉碎机制来改变函数名 以区分参数不同的同名函数 名字分割机制是指一系列代码被加到函数名上以指示参数类型以及它们出现的次序 v voidc chari intf floatl longd doubler longdouble intf chara intf chara intb doublec 在内部分别被表示为 f c和f cid而函数f cid 被表示为f cidv以示区别 编程 求出一个整数及一个浮点数的平方 练习 includeintsquare inti returni i doublesquare doublej returnj j voidmain inta doubleb cout a b cout 整数 a 的平方是 square a endl cout 浮点数 b 的平方是 square b endl 设计两个求面积的函数 然后自行输入数据进行测试 area 求圆面积 需传递一个参数 area 求矩形面积 需传递两个参数 练习 要求 统计所输入的某数据类型的数中零的个数以及各位数字的最大值 包括 有符号整数 无符号整数 实数 四舍五入后再统计 和复数 统计其实部 练习 分析 fun有两个处理结果 一个是统计所输入的某数据类型的数中零的个数 另一个是各位数字的最大值 为了处理不同类型的数据 fun函数有4种重载形式 include includestructcomplex doublereal doubleimag intfun unsignedn int intfun doubled int 重载函数fun int int 5 7构造函数和析构函数 一 构造函数 1 构造函数的需要性 变量初始化 inta 1 int p 结构初始化 structstudent intsemesHours 总学时数floatgpa 平均成绩 voidfn students 100 3 5 创建结构变量并初始化 5 7构造函数和析构函数 一 构造函数 1 构造函数的需要性 classstudent public 公有成员 private intsemesHours floatgpa voidfn students 100 3 5 error voidfn s semesHours 100 s gpa 3 5 5 7构造函数和析构函数 一 构造函数 1 构造函数的需要性 classstudent public voidinit semesHours 100 gpa 3 5 private intsemesHours floatgpa voidfn students s init 初始化 5 7构造函数和析构函数 一 构造函数 称为构造函数的成员函数 在定义对象的同时根据提供的参数个数和类型自动隐式地被调用 完成对象的初始化工作 构造函数的作用就是在对象被创建时利用特定的值构造对象 将对象初始化为一个特定的状态 使其具有区别于其他对象的特征 2 构造函数的作用 3 构造函数的特点 构造函数名必须和类名相同 构造函数没有返回值 构造函数只能由系统自动调用 其他任何过程都无法再调用它 通常构造函数被定义在公有部分 voidmain Deskd Chairc 3 构造函数的特点 构造函数名必须和类名相同 构造函数没有返回值 构造函数只能由系统自动调用 其他任何过程都无法再调用它 通常构造函数被定义在公有部分 如果没有定义构造函数系统会

温馨提示

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

评论

0/150

提交评论