资源预览内容
第1页 / 共23页
第2页 / 共23页
第3页 / 共23页
第4页 / 共23页
第5页 / 共23页
第6页 / 共23页
第7页 / 共23页
第8页 / 共23页
第9页 / 共23页
第10页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第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 或 emplate 早期模板定义使用的是class,关键字typename是最近才加 入到标准中的,相比class,typename更容易体现“类型” 的观点,虽然两个关键字在模板定义时是等价的,但从代 码兼容的角度讲,使用class较好一些。 模板有函数模板和类模板之分,本章将分别进行介绍。12.2 函数模板中的add函数便是一个函数模板,编译器根据函数模板的定义,检查传入的参数类型 ,生成相应的函数,并调用之。函数模板的定义形式如下: template 返回类型 函数名(参数列表) /函数体 关键字template放在模板的定义与声明的最前面,其后是用逗号分隔的模板参数表, 用尖括号(括起来,紧跟在函数模板实例的名字后面。看一段示例代 码12-4:12.2.4 特化C+引入了特化(explicit specialization)来解决某些 类型在函数中的特殊操作,当编译器寻找到与函数调用的 特化时,先使用特化的定义,不再使用模板函数。 特化的基本格式为: templater class 类名 /类定义 如果对某个特殊类型进行了显式特化处理,显式特化定义 的类优先于通用模板类,类似于覆盖或隐藏的操作。12.3.5 部分特化C+引入了部分特化(partial specialization)来部分地限制类 模板的通用型,例如中可使用下述方式对类定义特化: emplate class Example /显式特化 /类定义 12.4 模板的嵌套 模板的套嵌可以理解成在另外一个模板里面定义 一个模板。以模板(类,或者函数)作为另一个 模板(类,或者函数)的成员,也称成员模板。12.4.1 函数成员模板可以将函数模板作为另一个类(必须是模板类)的成员,称为函 数成员模板,其用法和普通成员函数类似,见示例。12.4.2 对象成员模板 类模板的定义可以放在另一个类中,实例化后的 模板类对象可以作为另一个类的成员,请看示例 : 代码12-10中,理解的难点在于“类模板不等于类 定义,需要实例化或特化来生成类实例”。上述 代码中,Inside类模板的访问权限为public,因 此,可以调用下述语句: “Outside:Inside obin(3.5);” 在Outside类内使用“Inside t;”语句声明了 Inside类的对象,在Outside模板类对象创建 时,首先采用隐式实例化先生成Inside类的定 义,而后根据此定义创建对象成员t。12.5 模板参数模板包含类型参数(如class Type)和非类型参数(如int NUM,NUM是常量),实际上,模板的参 数可以是另一个模板,也就是说,下述形式是合法的: template class T2, class T3,int Num; 上述简单示例将原来简单的“class T2”或“Typename T2”扩充为“template class T2”,来看一段示例:12.6 小结 模板是C+引入的新特性,也是下章要介绍的标准 模板库STL的基础,模板有函数模板和类模板之分 ,两种应用有很多相似之处。学习模板,最重要 的是理解模板定义(函数模板定义、类模板定义 )与具体定义(函数定义和类定义)的不同,模 板不是定义,要通过实例化(通过模板)或特化 (避开模板)来生成具体的函数或类定义,再调 用函数或创建类的对象。 模板支持嵌套,这就是说可以在一个模板里面定 义另一个模板。以模板(类,或者函数)作为另 一个模板(类,或者函数)的成员,也称成员模 板。同时,模板也可以作为另一个模板的参数, 出现在类型参数表中。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号