c++模板函数探幽.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
c模板函数探幽

书签在视图 文档结构 第8章 函数探幽 8.5函数模板 什么是函数模板? 有时会被称作通用编程,也叫参数化类型。指的是使用通用类型来定义函数(可以理解为使用一个占位符占位置),其中的通用类型可以使用int,double等来替换。把类型作为参数传递给末班后,编译器就会生成该类型的函数,比如传递的是int型,那么生成的就是int型的函数。 实例 代码部分(按住ctrl +鼠标左键) 使用函数实例有什么好处? 假设要交换了值,这两个值是double型。那么就设置一个double的函数进行。当又需要交换int类型的时候,还需要进行设计int类型的函数。这样子浪费时间,容易出错,效率。使用模板可以直接替换,节省时间,可靠。 如何定义一个模板? Template class any Void swap ( any a, any b) {} 第一行指出,要建立一个模板,并且将类型命名为any,template 和 class是关键字,是必须的。必须使用尖括号。可以用typename替代class.类型名any可以任意选择,这里是any. 什么时候使用模板? 当使用相同的算法,不同的类型的函数的时候。 通过程序清单 实例 代码部分(按住ctrl +鼠标左键) 可以看出来 : 当模板接收int型数据的时候,int会替换所有的any 最终生成如下定义: void Swap(int a, int b) { int temp; temp = a; a = b; b = temp; } 当接收double 类型的时候,最终生成了如下代码: void Swap(double a, double b) { double temp; temp = a; a = b; b = temp; } 8.51重载模板 1)什么是重载? 也叫函数的多态。使用多个同名函数,可以有多重形式。多个同名函数。但是使用不同的参数列表。 2)为什么重载模板? 当对多个不同类型使用同一算法的时候使用模板,并非所有的类型都是用相同的算法(所以重载),比如2个数组需要交换数据和两个int或者double交换数据显然不同。 3)既然需要重载,为什么还需要模板,直接写函数不就行了? 对大多数数据都可以用(模板),极个别如数组需要重载,使用模板增加通用性。方便快速。 重载模板实例 原来的函数特征为(any,any)。新模板(any [],any[]) 最后一个模板show(int [])是具体类型,不是通用类型.可以修改成通用类型template class Any void Show(Any a[]) 效果一样。还可以用指针接收 template class Any void Show(Any *a) 8.5.2显式具体化 什么是显示具体化? 显示具体化 正确的叫法应该叫特例化。特殊的情况,直接就指出这是job 的一个具体化(实例)。如前面的列子,交换两个数值。比如我要交换一个结构体: Struct job { char name[40]; Double salary; Int floor; } 因此any(占位符) 就成为了job结构。使用用temp =a; a=b; b=temp;可以成功交换结构体内容。但是当我只想交换char name[40]的内容。结构的其他两个成员不交换,显然不行。显然用上述例子的代码是不行的,因为我现在只交换一部分。这种特殊的情况需要特殊对待。 c++标准化: 对于给定的函数名,可以有非模板函数,模板函数,显式具体化,重载函数。(同一个函数名称可以包含这么多类型) 显式具体化(特例)的原型和定义应以template打头,并且要通过名称指出类型。如 templatevoid swapjob(job ,job )也可写成template void swap(job ,job ),swapjob中的job 是可选的,因为函数参数类型已经说明他是job的一个具体化。以上是比较现代的做法,如无法编译就用早起的写法void swapjob (job ,job) 具体化将(特例)覆盖常规模板,而非末班函数将覆盖具体化(特例)和常规模板(优先级) 显式具体化(特例)实例 8.5.3 实例化和具体化 函数模板和函数的区别? 区别是:函数模板本身并不会生成函数定义,他只是一个用于生成函数定义的方案。 2)什么时候生成函数定义? 当具体使用的时候,编译器会使用特定类型为函数生成定义,这时候得到了函数的实例。 3)什么是实例化? 当具体使用的时候,编译器会使用特定类型为函数生成定义

文档评论(0)

haihang2017 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档