- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
表现为参数的多态性 4 qtech int max ( int x, int y)
C++面向对象程序设计 第7章 模板 本章内容 模板的概念 函数模板与模板函数 类模板与模板类 标准模板库 7.1 模板的概念 模板是C++?语言的一个重要特性。模板使得程序员能够快速建立具有类型安全的类库集合和函数集合,是通用程序设计的利器。它的实现,提供了重用程序源代码的有效方法,方便了更大规模的软件开发。 若一个程序的功能是对任意类型的数据进行同样的处理,则将所处理的数据类型说明为参数,就可以把这个程序改写为模板。 模板实际上就是把函数或类要处理的数据类型参数化,表现为参数的多态性。 与宏定义的区别 宏定义避开了类型检查,会导致不同类型参数之间的比较; 可能会在不该替换的地方进行替换。 两种模板机制:函数模板和类模板 在声明了一个函数模板后,当编译系统发现有一个对应的函数调用时,将根据实参中的类型来确认是否匹配函数模板中对应的形参类型,然后生成一个重载函数。 (模板函数) 类模板允许用户为类定义一种模式,使得类中的某些数据成员、函数成员的参数和返回值能取任意类型。在声明了一个类模板之后,可以创建类模板的实例,它称为模板类。 7.2 函数模板与模板函数 函数模板的声明 函数模板 模板函数 重载函数模板 2. 函数模板 函数模板定义由模板说明和函数定义组成。所有在模板说明的类属参数必须在函数定义中至少出现一次。函数参数表中可以使用类属类型参数,也可以使用一般类型参数。 3. 模板函数 函数模板的一个具体实例。函数模板的实例化由编译器来完成,采用下面两个步骤: 根据函数调用的实参类型确定模板形参的具体类型; 用相应的类型替换函数模板中的模板参数,完成函数模板的实例化。 模板函数类似于重载函数,但函数重载时,每个函数体可以执行不同的动作,但同一个函数模板实例化后的模板函数都执行相同的动作。 4.重载函数模板 模板函数与重载是密切相关的。实际上,从函数模板产生的相关函数都是同名的,因此C++编译系统采用重载的方法调用相应函数。 函数模板本身可以用多种方式重载,这需要提供其他函数模板,指定不同参数的相同函数名。 用户可以用一个非模板函数重载一个同名的函数模板。 用户可以用一个非模板函数重载一个同名的函数模板。 函数模板与同名的非模板函数的重载方法遵循下列约定: 寻找一个参数完全匹配的函数,如果找到了,就调用它。 寻找一个函数模板,将其实例化产生一个匹配的模板函数,如果找到了,就调用它。 试一试低一级的对函数的重载方法,如果通过类型转换可产生参数匹配等,如果找到了,就调用它。 7.3 类模板与模板类 类模板的定义 类模板的使用 类模板的友元 类模板与静态成员 2.类模板的使用 类模板也不能直接使用,必须先实例化为相应的模板类,定义该模板类的对象后才能使用。使用类模板是指用某一数据类型替代类模板的类型参数,声明类模板之后创建模板类. 一般格式如下: 类模板名 类型实参表 由类模板经实例化而生成的具体类称为模板类,格式为:类模板名 类型实参表 对象名[(实参表)] 其中,“类型实参表”应与该类模板中的“类型形参表”相匹配。“对象名”是定义该模板类的一个或多个对象。 3.类模板的友元 类模板的友元和类的友元的特点基本相同,但也具有自身的特殊情况。 友元函数无模板参数 友元函数含有类模板相同的模板参数 友元函数含有与类模板不同的模板参数 4.类模板与静态成员 在非模板类中,类的所有对象共享一个静态数据成员,静态数据成员应在文件范围内初始化。 从类模板实例化的每个模板类都有自己的类模板静态数据成员,该模板类的所有对象共享一个静态数据成员。 和非模板类的静态数据成员一样,模板类的静态数据成员也应在文件范围内初始化。 The constructors are: template class T PairT::Pair( ) { //In the default constructor, you first = T( ); //can initialize first and second second = T( ); //using the default Ts constructor. } template class T PairT::Pair(T first_value, T second_value) { first = first_value; second = second_value; } Pairint score1; Pairchar seats1; Pairint score2(1,2); Pairchar seats2(A, B); score1.set_element(1,3); score1.se
文档评论(0)