第12章 模板(Template).ppt

  1. 1、本文档共23页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第12章 模板(Template)

第12章 模板(Template) 现在的C++编译器实现了一项新的特性:模板(Template),简单地说,模板是一种通用的描述机制,也就是说,使用模板允许使用通用类型来定义函数或类等,在使用时,通用类型可被具体的类型,如int、double甚至是用户自定义的类型来代替。模板引入一种全新的编程思维方式,称为“泛型编程”或“通用编程”。 12.1 为什么要定义模板 形象地说,把函数比喻为一个游戏过程,函数的流程就相当于游戏规则,在以往的函数定义中,总是指明参数是int型还是double型等等,这就像是为张三(好比int型)和李四(好比double型)比赛制定规则。可如果王五(char*型)和赵六(bool型)要比赛,还得提供一套函数的定义,这相当于又制定了一次规则,显然这是很麻烦的。模板的的引入解决了这一问题,不管是谁和谁比赛,都把他们定义成A与B比赛,制定好了A与B比赛的规则(定义了关于A和B的函数)后,比赛时只要把A替换成张三,把B替换成李四就可以了,大大简化了程序代码量,维持了结构的清晰,大大提高了程序设计的效率。该过程称为“类型参数化”。 12.1.1 类型参数化 在讲解类型参数化之前,先来看一个示例: 12.1.2 模板的定义 模板的引入使得函数定义摆脱了类型的束缚,代码更为高效灵活。C++中,通过下述形式定义一个模板: template class T 或 emplatetypename T 早期模板定义使用的是class,关键字typename是最近才加入到标准中的,相比class,typename更容易体现“类型”的观点,虽然两个关键字在模板定义时是等价的,但从代码兼容的角度讲,使用class较好一些。 模板有函数模板和类模板之分,本章将分别进行介绍。 12.2 函数模板 中的add函数便是一个函数模板,编译器根据函数模板的定义,检查传入的参数类型,生成相应的函数,并调用之。函数模板的定义形式如下: template 模板参数表 返回类型 函数名(参数列表) { //函数体 } 关键字template放在模板的定义与声明的最前面,其后是用逗号分隔的模板参数表,用尖括号()括起来。模板参数表不能为空,模板参数有两种类型: class或typename修饰的类型参数,代表一种类型; 非类型参数,由已知类型符,代表一个常量表达式。 返回类型和函数的参数列表中可以包含类型参数,在函数中可以使用模板参数表中的常量表达式,如: templateclass Any,class Another,int number double fun(Any a,int b,Another c) { //函数体,其中number可以作为一个int型常量来使用 } 12.2.1 函数模板的使用 函数模板的使用规则和普通函数是相同的,在使用函数模板之前,必须对函数模板进行声明,此说明必须在外部进行,也就是说不能在任何一个函数(包括main函数)中声明,声明的格式为: template class T1[,class T2,……] //或emplate class T1[,class T2,……] 函数原型; 和普通函数一样,如果在使用函数模板前对函数模板进行了定义,函数模板的声明可以省略。 12.2.2 隐式实例化 函数模板实际上不是个完整的函数定义,因为其中的类型参数还不确定,只是定义了某些类型的角色(或变量)在函数中的操作形式,因此,必须将模板参数实例化才能使用函数,用模板实例化后的函数也称为模板函数,最简单的实例化称为“隐式实例化”(implicit instantiation)。下面通过例子代码12-3进行说明。 12.2.3 显式实例化 早期的编译器只支持隐式实例化,新的C++标准允许显式实例化(explicit instantiation),由程序员直接命令编译器创建满足条件的模板函数,用以解决因重载等引入的二义性问题。 显式实例化的标准格式为: template 返回类型 函数名类型实参表(函数参数表); 最前面的关键字template说明这是对函数模板的实例化,类型实参被显式指定在逗号分隔的列表中,用尖括号括起来,紧跟在函数模板实例的名字后面。看一段示例代码12-4: 12.2.4 特化 C++引入了特化(explicit specialization)来解决某些类型在函数中的特殊操作,当编译器寻找到与函数调用的特化时,先使用特化的定义,不再使用模板函数。 特化的基本格式为: templater 返回类型 函数名[类型实参表](函数参数表) { //函数体定义 } 类型实参表可以省略,由后续的函数参数表来指定。 显式实例化的意思是“使用模板生成某些类型参数的模板函数”,而特化的意思是“不使用模板生成函数定义

文档评论(0)

liudao + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档