g第7章方法_第1页
g第7章方法_第2页
g第7章方法_第3页
g第7章方法_第4页
g第7章方法_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

第7章方法 前言7 1方法的定义和调用7 2方法的参数7 3方法的重载7 4静态和非静态方法总结 前言 在面向过程的C语言中 通常可分为数据和对数据的操作两大部分在面向对象的C 中 大多数情况下 数据成为类的数据成员对数据的操作成为类的方法成员在C 中 任何事物都必须封装在类中 故C 中没有全局变 常 量和全局函数的概念 返回首页 7 1方法的定义与调用 7 1 1方法的定义7 1 2方法的调用 返回首页 7 1 1函数的定义 C 中的每一个函数一般从五个方面来进行定义 方法修饰符 返回类型 方法名 形式参数表和方法体 定义一个函数的语法格式为 修饰符 方法体 例如 publicintmax inta intb intt if a b t a elset b returnt 返回上节 例7 1 给出以下程序的运行结果 classCcount publicintFunc intn if n 0 return1 elseif n 0 return0 elsereturn 1 publicstaticvoidMain intn n int Parse Console ReadLine CCountcount newCcount Console WriteLine 返回结果 0 count Func n 返回上节 7 1 2方法的调用 注意 在C 中 除了主方法main和构造方法 析构方法由系统自动调用外 其他方法都是由主方法直接或间接调用的 调用的语法格式为 1 对象方法 对象 方法名 实际参数表 2 对象内部中调用内部方法 方法名 实际参数表 3 静态方法 类 方法名 实际参数表 注意 C 中没有默认参数的概念 所以都必须传递确定的值 返回上节 7 2方法的参数 7 2 1值参数7 2 2引用型参数7 2 3输出参数7 2 4数组型参数 返回首页 7 2 1值参数 记忆 值参数传递的是调用参数的一分拷贝 例7 1输入a b两个数 求和usingSystem classSum publicfloatAdd floatx floaty returnx y publicstaticvoidMain floata b Sumobj newSum Console Write 请输入一个浮点数a a float Parse Console ReadLine 转换成浮点数Console Write 请输入一个浮点数b b float Parse Console ReadLine 转换成浮点数console WriteLine 总计 0 obj Add a b console WriteLine a 0 b 1 a b 返回上节 7 2 2引用类型 ref 参数 记忆 C 编译器把参数传递指向和调用代码的变量一样的内存中去例7 2交换a b两个数usingSystem classRefSwap publicvoidSwap reffloatx reffloaty floattmp tmp a a b b tmp publicstaticvoidMain floata b RefSwapobj newRefSwap Console Write 请输入一个浮点数a a float Parse Console ReadLine 转换成浮点数Console Write 请输入一个浮点数b b float Parse Console ReadLine 转换成浮点数obj Swap refa refb console WriteLine 交换结果 0 1 a b 注意 在调用方法之前 被传递的参数一定已被初始化过 返回上节 7 2 3输出 out 参数 记忆 与ref类似 只是传入时不必初始化 而在返回时 必须已有值 usingSystem classTest publicvoidSplitPath stringpath outstring dir outstringname inii path Length while i 0 charch path i 1 if ch ch ch break dir path Substring 0 i name path Substring i publicstaticvoidMain paramsstring arg stringdir name SplitPath arg 0 outdir outname console WriteLine 目录 0 文件名 1 dir name 注意 在返回之前 被传递的参数必须初始化 不需要初始化 返回上节 7 2 4数组类型 params 参数 例 classTest publicstaticvoidF paramsint args Console Write 数组含有 0 个元素 args Length foreach intiinargs Console Write 0 i Console WriteLine publicstaticvoidMain paramsstring args int a 1 2 3 F a F 10 20 30 40 F 显示 数组含有3个元素 123数组含有4个元素 10203040数组含有0个元素 注意 如果将其定义为publicstaticvoidF int args 则仅能向其传递F a 返回上节 7 2 4数组类型 params 参数 记忆 当需要传递不确定的同类型参数时 可以使用它 例 usingSystem classTest publicvoidMain paramsstring arg foreach stringsinarg Console WriteLine s 在控制台中 TestIlikeit 我喜欢 回车 显示 Ilikeit我喜欢 返回上节 7 2 4数组类型 params 参数 注意 1 参数中如果包含数组型参数 那么它必须在参数表的最后F inta paramsintc doubleb 错误F inta doubleb paramsintc 正确2 数组型参数只允许是一维数组 如string string 类型都可以 但string 不行3 数组型参数不能再有ref和out修饰符 返回上节 7 3方法的重载 7 3 1什么叫重载 7 3 2构造方法的重载7 3 3运算操作符的重载 返回首页 7 3 1方法的重载 什么叫重载 在同一类中多于两个的同名方法 重载 编译器如何区分重载的方法 编译器会根据方法的特征 又称签名 的不同来区分同名的方法 所以定义方法重载时 不能使 签名 相同 voidopen voidopen 错误 签名相同voidopen intopen 错误 签名相同voidopen voidopen intarg 参数个数不同 签名不同 voidopen intarg voidopen stringarg 参数类型不同 签名不同voidopen intarg1 stringarg2 voidopen stringarg1 intarg2 参数类型的顺序不同 签名不同voidopen int ars voidopen paramsint args 错误 虽然表面上 个数不一定相同 但是参数类型都是数组类型 所以编译器不可以识别 voidopen voidopen inta voidopen inta intb voidopen paramsint args 正确 参数虽然存在相同的可能性 但是签名完全不同 所以编译器可以识别 返回上节 7 3 2构造方法的重载 用法 在实例化时 可以通过调用不同的构造方法 达到不同的初始化效果例7 9classCircle intx y doubleradius privateconstfloatPI 3 1415926f publicCircle 无参初始化x 0 y 0 radius 0 0 publicCircle intPositionX intPositionY 提供圆心坐标x PositionX y PositionY radius 0 0 publicCircle doubleRadius 提供半径x 0 y 0 radius Radius publicCircle intPositionX intPositionY doubleRadius 提供完成参数x PositionX y PositionY radius Radius 实例化Circlemyc newCircle x 0y 0 r 0 0 实例化Circlemyc newCircle 100 50 x 100y 50 r 0 0 实例化Circlemyc newCircle 50 0 x 0y 0 r 50 0 实例化Circlemyc newCircle 100 50 50 0 x 100y 50 r 50 0 返回上节 7 3 3运算符的重载 7 3 3 1问题的提出7 3 3 2使用运算符重载7 3 3 3语法7 3 3 4例子7 3 3 5可重载的运算符7 3 3 6运算符重载的设计准则 返回上节 7 3 3 1问题的提出 当我们使用一个新的自定义类时 相当于使用一种新类型 那么 如果运算符 也能为我们所用就好了 例 如某个平面上的点CPosition类 我们把实例化成对象 这时如果要移动它 classCPosition publicx x坐标publicy Cpositiona1 offset a1 x a1 x 3 x轴正向移3格或a1 x 3 a1 y a1 y 10 y轴负向移10格或a1 y 10 或a1 Move 3 10 x y轴偏移缺点 1 不够直观 使用麻烦 2 没有充分表达OO的思想 返回上节 7 3 3 2使用运算符重载 新的解决方案 a1 a1 offset offset也是一个点 不过它的x y值是偏移量或a1 offset 达到了意义明确 直观的好处 这是由于我们对 进行了改写 重载 返回上节 7 3 3 3定义 publicstatic返回值operatorop 对象1 对象2 注意 1 必须定义为publicstatic2 参数的个数取决于有多少个操作数 如 两个操作数 只有自己一个 3 单目运算符时 参数类型必须与所包含类 结构 的类型一样4 双目运算符时 第一个参数的类型与3要求相同 5 并不是所有运算符都能重载 如 不能重载6 不能重载 要拆开看 分别重载 就能实现这种组合7 返回值通常为所包含类 结构 的类型 返回上节 7 3 3 4示例 例 上节说的移动点位置重载 号classCPosition publicstaticCPositionoperator CPositionp1 Cpositionoffset CPositionnewp newCposition newp x p1 x offset x newp y p1 y offset y returnnewp 使用p1 p2 offset 或p1 offset 记忆 通常重载可以形成 这种组合的运算符时 一定要在实现中产生新的实例 不能是这样 p1 x offset p1 x offset returnp1 否则可能会导致有些运算出错 思考 有哪些运算会出错 返回上节 7 3 3 5可重载的运算符 通常有 单目 truefalse 双目 比较运算符 注意 1 不允许重载 newtypeofsizeofis 未完 2 没有使用的运算符如 3 不能改变运算符的优先级 返回上节 7 3 3 6运算符重载的设计准则 切记 1 不是一切自定义类的运算均要实现运算符重载 不能错用 不能滥用如果 依据操作数的类型而具有不同的含义 那么代码的运行就不再是透明的 会出现大量不可预料的副作用2 在不会导致理解错误的情况下使用例 C购物车a C商品g a a g 不好 如果被写成a b g怎么理解 b为另一辆购物车 3 无意义使用时绝对不要重载它例 C苹果a C梨b C水果cc a b 不知所云4 不断地积累经验 但它能更直观 无误解时 才重载一个运算符 返回上节 7 4静态与非静态方法 7 4 1方法的分类7 4 2静态方法的调用7 4 3在方法中访问类内的成员 返回首页 7 4 1方法的分类 类的成员分两种 方法也分两种静态和非静态静态方法用static修饰 反之为非静态方法静态方法一种特例 它不属于该类中的任何具体实例 静态方法常被当作C C 中的全局函数来看待 或者统计该类的公共信息如选票是一个类 如果要统计总票如的话 class选票 static票数 static统计 投票 被选举人 返回上节 7 4 2静态方法的调用 类名 静态方法名 参数表 例 Console WriteLine hello Math Sqrt 4 int Parse 1238 数据库 Open 连接字串 返回上节 7 4 3在方法中访问类内的成员 原则 静态方法仅能访问类内静态成员 非静态方法可能访问类内任何成员 还要受访问修饰符限制 例 p7 20classSQLServerDb staticstringprogress1 正在修复数据库 stringprogress2 已修复数据库 publicstaticvoid修复

温馨提示

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

评论

0/150

提交评论