




已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
8 1C 内联函数223 内联函数是C 为提高程序运行速度所做的一项改进 和常规函数的主要区别在于C 编译器如何将他们组合到程序中 调用普通函数 需要一定的额外开销内联函数的代码在编译阶段直接替换函数调用语句 程序无需跳转 因此 运行速度较快 但如果内联函数被重复多次的调用 代码将占用较多的内存 如果函数调用的时间远远小于函数本身的执行时间 就不宜选用内联函数 如果函数代码执行时间非常短 并且被调用次数多 内联就可以节省大部分时间 内联函数与常规函数 内联函数与常规函数见图8 1内联函数声明前加关键字inline函数定义前加关键字inline 但编译器不一定将一个函数作内联函数处理 假如函数大或递归 就不做内联处理 程序8 1inline cpp将square函数声明为内联 define也可以实现内联的功能 如 defineMAX a b a b a b 8 2引用变量225 引用是复合类型 已经定义的变量的别名引用变量的主要用途是用作函数的形参 将引用变量用作参数 函数将使用原始数据 而不是其拷贝 与指针一样 为函数处理大型结构提供了一种方便的途径 8 2 1创建引用变量225 intrats int程序8 3sceref cpp不能将引用再成为另一个变量的别名 8 2 2将引用用作函数参数227 按引用传递 允许被调函数能够访问调用函数中的变量 程序8 4swaps cpp交换两个值 引用和指针方法都成功交换了调用函数的两个值 而传值方式没有 声明 voidswapr int函数定义 引用参数与传值代码相同 引用不同 使用引用参数函数时 wallet1与wallet2对引用形参变量a b进行了初始化 符合引用必须初始化的定义 8 2 3引用的属性和特别之处230 程序8 5cubes cpp 按引用传递可以改变调用函数的变量值 为了达到不拷贝 又不改变调用函数变量 可以在函数原型和函数定义中使用const对引用参数限定 doublerefcube double X 临时变量 引用参数和const 如果实参与const引用参数不匹配 C 将生成临时变量 下面两种种情况 实参的类型正确 但不是左值 左值参数是可被引用的数据对象 如变量 数组元素 结构成员 引用 解引用的指针 非左值包括常量 包含多项的表达式 函数返回值等实参的类型不正确 但可以转换为正确的类型对于形参为const引用的C 函数 如果实参不匹配 则其行为类似于按值传递 尽可能使用const 避免无意中修改数据 不管实参是否const const形参都能接受 const形参表明在函数内不能修改此数据函数能够处理const和非const实参 否则只能接受非const数据使函数能够正确生成并使用临时变量 形参是没有const的引用 则实参必须是左值 举例 8 2 4将引用用于结构232 引用非常适合用于类和结构 使用结构引用的方式与使用基本变量引用相同 程序8 6strtref cppconstsysop使得sysopref成为looper的别名 返回引用 通常 返回极致将返回值复制到临时存储区域 随后调用程序访问该存储区域 取值 而返回引用意味着调用程序直接访问返回值 不需要拷贝 返回引用的效率更高 通常 引用将指向传递给函数的引用 实际上调用函数访问的就是自己的变量 返回引用时需注意问题 是用函数调用来访问结构的成员 use looper used 由于use 返回一个指向looper的引用 所以相当于直接访问了looper的成员 如果返回的不是引用 则将是临时变量的成员 传值返回的是临时变量 要避免返回不存在的内存单元 如constsysop 由于newsys是临时变量 函数use结束后已经无效 然而调用函数还接受了它的引用 将引起运行错误 另外一般不返回new分配对象的引用 因为容易忘记使用delete 为何返回const引用 如果省略const 则可以使用这样的代码 use looper used 10 甚至可以使用use looper sysnew 这样函数处理的那个对象就被覆盖或丢弃了 函数调用也显得没有了意义 应尽量避免设计这样的程序 8 2 5将引用用于类对象235 可是通过使用引用 将类string ostream istream ofstream ifstream等类的对象作为参数 程序8 7strquote cpp为了实现同种功能 将字符串s2放到字符串s1后面 三个不同版本函数 只有函数version1完成了此功能 注意 将char 实参赋给conststring 类型 因为char 可以转换为string 又由于形参带有const 会创建临时变量 所以能够转换成功 举例 将ostream对象的引用用作参数实现输出 8 2 6对象 继承和引用238 继承 基类引用可以指向派生类对象 无需类型转换 因此可以定义一个接受基类引用的函数 调用时可以传递基类对象 也可以传递派生类对象 比如ostream是基类 ofstream是派生类 如程序8 8filefunc cpp参数os可以指向ostream对象 也可以指向ofstream对象 因此函数调用的实参为cout 可以输出到终端 fout 输出到文件 8 2 7何时使用引用参数240 使用引用参数的主要原因 能够在被调函数中修改调用函数的值 非const引用 传递引用而不是整个数据对象 能提高程序效率传值 指针参数 引用参数的选用 不修改数据数据很小 如int 使用传值 数组 使用带const的指针 较大的结构 使用带const的指针或const引用类对象 使用const引用 如cout string修改数据 内置类型 使用指针 如int数组 指针结构 引用或指针类对象 引用 8 3默认参数240 默认参数指函数调用中省略了实参时自动使用的一个值 设置默认值 举一些例子 并判断是否正确 将值赋给原型中的参数 必须从右向左添加默认值 实参按照从左向右的顺序一次被赋给相应的形参默认参数不是编程的大突破 只是提供一种便捷的方式 程序8 9left cpp函数原型声明和调用注意 设置字符串长度的一种方法 8 4函数重载242 函数重载指的是可以有多个同名的函数 对名称进行了重载 函数重载的关键是参数列表 称为函数特征标 如果两个函数的参数数目和类型相同 参数的排列顺序也是相同的 则特征标相同 变量名无关紧要 函数调用时 先查看有无匹配的原型 如果没有匹配的原型 则尝试使用标准类型转换强制进行匹配 匹配的目标唯一 则成功 否则失败 C 认为调用错误 函数重载 编译器在检查特征标时 将把类型引用和类型本身视为同一个特征标 如 doublecube doublex doublecube double重载的返回类型可以不同 也可以相同 而特征标必须不同 8 4 1重载范例243 程序8 10leftover cpp函数left有两个原型 调用的实参不同 分别匹配不同的函数left返回一个指针 分别返回字符串的前n位或者整数的前n位 8 4 2何时使用函数重载245 仅当函数基本上执行相同的任务 但使用不同形式的数据时 才采用函数重载 C 如何跟踪每一个重载函数呢 使用一种神奇的操作 名称修饰 根据函数原型中指定的形参类型对每个函数名进行加密 对参数类型和数目进行编码 函数重载的参数类型匹配 1确定候选函数 所有可见的复合名称要求的函数2确定可行函数 所有能够调用成功的函数原型3确定最佳可行函数 可行函数中的一个函数 所有参数位置的匹配程度都不比其他可行函数低 至少有一个参数位置高于其他可行函数 就说此函数为最佳可行函数 最佳可行函数必须唯一 不唯一则是错误调用 匹配程度优先级 精确匹配 不需要类型转换 包括引用 const修饰等 都属于精确匹配提升转换 char int short intfloat double标准转换 整型和浮点型之间 浮点与整型中 除了提升转换之外的隐式转换用户自定义转换 比如cin到bool型的转换 char 到string的转换 8 5函数模板246 函数模板是通用的函数描述 使用通用类型来定义函数 通用类型调用时可用具体类型替换 通过将类型作为参数传递给模板 可是编译器生成该类型的函数 这类方法被称为通用编程 template class也可为typename voidswap T 使用模板前需要提供模板原型和定义 函数模板使用 程序8 11funtemp cppswap i j 这个语句的时候 根据函数模板生成函数voidswap int先生成函数voidswap double double 然后用实参x y调用函数模板只是缩减了代码 不能缩短可执行程序 最终的可执行程序不包含任何模板 只包含由模板生成的实际的函数 使用模板使得生成多个函数的定义更简单 更可靠 8 5 1重载的模板248 需要多个对不同类型使用同一种算法时 可使用模板 但并非所有的类型都使用相同算法 可以像常规函数定义那样重载模板定义 被重载的末班的函数特征标必须不同 程序8 12twotemps cpp 8 5 2显式具体化250 提供一个具体化函数定义 当编译器找到与函数调用匹配的具体化定义时 将使用该定义 而不在寻找模板 同等匹配条件下 非模板函数高于显式具体化函数 高于模板函数voidswap int 选2 显式具体化 也可写作templatevoidswap double程序8 13twoswap cpp 实例化 根据函数模板生成函数叫做模板的隐式实例化 没有指定参数的类型 而是由编译器根据实参来推定函数原型 叫做模板实参推演 还可以提供显式实例化 templatevoidswap int int 意思是使用swap 模板生成int类型的函数定义 也可在调用时 显式指定参数类型 swap a b 虽然a b都是int类型 但函数原型还是voidswap double double 因为显式指定了形参的类型 这里会发生int double的转换 8 5 3实例化和具体化253 隐式实例化 显式实例化 显式具体化统称为具体化 都表示使用具体类型的函数定义 而不是通用描述 显式具体化需要前缀template 实例化没有 显式具体化的函数定义需要提供 而具体化的函数有模板生成 8 5 4编译器选择使用哪个函数版本254 对于函数重载 函数模板和函数模板重载 要决定为函数调用选择哪个函数定义 尤其是多个参数时 称为重载解析第1步 创建候选函数列表 包括符合名称的可见的函数和模板函数第2步 确定可行函数列表 都能够正确调用和解析 第3步 确定是否有最佳可行函数 有则使用 没有则函数调用出错 匹配最佳的选择顺序 1完全匹配 和普通函数重载的含义相同 但是常规函数优于具体化函数优于模板函数 具体优于抽象2提升转换3标准转换4用户定义的转换 完全匹配和最佳匹配 参见表8 1完全匹配允许的无关紧要转换但有时候即使两个函数都完全匹配 仍可完成重载解析 1指向非const数据的指针和引用优先于非const的指针和引用参数匹配 例子255页2如果两个都是同级别的匹配
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年度导游资格考试考前冲刺练习题附参考答案详解【培优B卷】
- 2025年内蒙古满洲里市事业单位人才引进22人笔试备考题库及参考答案详解
- 2024年自考专业(护理)题库检测试题打印及参考答案详解AB卷
- 执业药师之《药事管理与法规》能力测试B卷含答案详解【培优a卷】
- 2025年湖南省中考历史试卷含答案(下册)(下)
- 农村零售市场消费升级趋势下渠道拓展策略分析报告2025
- 2025年新能源企业市场营销策略与品牌传播报告
- 2025简化版建筑材料购销合同范本全书
- 环境监测数据质量控制智能化平台建设与实施报告
- 2025年新能源技术创新趋势报告:新能源在航空航天领域的应用
- 广东省深圳市福田区红岭实验学校(上沙)2025-2026学年八年级上学期开学考试英语试卷(含答案)
- 羽毛球合作协议合同范本
- 2025年适老化家居市场分析报告
- 社区宣传工作知识培训课件
- 瑜伽相关知识培训课件
- 导乐师理论知识考核试题及答案
- 2025年中国移动式皮带输送机市场调查研究报告
- ETL开发规范流程与案例分析文档
- 高校学生就业服务平台建设方案
- 2025年全国计算机技术与软件专业技术资格(水平)考试系统集成项目管理工程师押题试卷
- 2025年北京市专业技术人员公需科目培训答案
评论
0/150
提交评论