C++面向对象程序设计 第6章 模板.pptVIP

  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面向对象程序设计第6章模板

第6章 模板 模板概述 模板(Template)把函数或类要处理的数据类型参数化,表现为参数的多态性。模板用于表达逻辑结构相同,且具体数据元素类型不同的数据对象的通用行为,从而使得程序可以从逻辑功能上抽象,把被处理的对象(数据)类型作为参数传递。 C++提供了两种模板机制:函数模板和类模板(也称为类属类)。模板中的类型参数也称为类属参数。 在声明了一个函数模板后,当编译系统发现有一个对应的函数调用时,将根据实参中的类型来确认是否匹配函数模板中对应的类型形参,然后生成一个重载函数。该重载函数的定义体与函数模板的函数定义体相同,它称之为模板函数(Template Function)。 函数模板与模板函数的区别是:函数模板是一个模板,其中用到通用类型参数,不能直接执行。模板函数是一个具体的函数,它由编译系统在遇到具体函数调用时所生成,具有程序代码,可以执行。 类模板允许用户为类定义一种模式,使得类中的某些数据成员、成员函数的参数和成员函数的返回值能取任意类型。 同样,在声明了一个类模板之后,可以创建类模板的实例,它称为模板类。类模板与模板类的区别是:类模板是一个模板,不是一个实实在在的类,其中用到通用类型参数。而模板类是一个类,可以由它定义对象。 模板、模板类、对象和模板函数之间的关系如图所示。 函数模板 声明函数模板 声明函数模板的一般格式如下: template 类型形参表 返回类型 函数名(形参表) { 函数体; } 说明如下: (1)“类型形参表”可以包含基本数据类型,也可以包含类类型。类型形参需要加前缀class或typename。关键词class或typename在这里的意思是“跟随类型形参”。如果类型形参多于一个,则每个类型形参都要使用class或typename。 (2)“形参表”中的参数必须是惟一的,而且在函数定义(包括形参定义)中要至少出现一次。 (3)在template语句与函数模板声明之间不允许有别的语句。 编写函数模板 编写函数模板的一般方法如下: (1)定义一个普通的函数,数据类型采用具体的普通的数据类型。 (2)将数据类型参数化 (3)在函数头前用关键字template引出对类型参数名的声明。 使用函数模板 函数模板是不能直接执行的,需要实例化为模板函数后才能执行。当编译系统发现有一个函数调用: 函数名(实参表); C++将根据“实参表”中的类型生成一个重载函数即模板函数。该模板函数的定义体与函数模板的函数定义体相同,而“形参表”的类型则以“实参表”的实际类型为依据。 函数模板的实例化 在模板函数被实例化之前,必须在程序的某个地方首先声明它,这样,就可以到后面再实例化为模板函数。 模板函数有一个特点,虽然模板参数T可以实例化成各种类型,但是采用模板参数T的各参数之间必须保持完全一致的类型。 自定义参数类型 可以在函数模板的“形参表”和对模板函数的调用中使用类的类型和其他用户定义的类型。如果这样,就必须在类中设计重载运算符,以便模板函数能对类变量进行正确的运算,否则会出现错误。 重载函数模板 模板函数与重载是密切相关的。实际上,从函数模板产生的相关函数都是同名的,因此C++编译系统采用重载的解决方法调用相应函数。 函数模板本身可以用多种方式重载,这需要提供其他函数模板,指定不同参数的相同函数名。 函数调用的匹配顺序 当一个实际的函数调用时,它既可以和一个重载函数相匹配或是参数转换后与某一重载函数相匹配,又可以与某一模板函数相匹配,这并不会产生二义性。只是调用哪一个需按照一定的规则安排先后次序。这些规则就是函数模板与同名的非模板函数的重载方法均遵循的约定: (1)寻找一个参数完全匹配的函数,如果找到了就调用它。 (2)在(1)失败后,寻找一个函数模板,使其实例化,产生一个匹配的模板函数,若找到了,就调用它。 (3)在(1)、(2)均失败后,再试一试低一级的对函数的重载方法,例如通过类型转换可产生参数匹配等,若找到了,就调用它。 (4)若以上均失败,则就是一个错误的调用。 类模板 声明类模板 类模板的成员函数被认为是函数模板,也称为类属函数。因此,当给出一个类模板的成员函数的定义时,必须遵循函数模板的定义。声明类模板的一般格式如下: template 类型形参表 class 类名 { 类声明体; }; template 类型形参表 返回类型 类名 类型名表::成员函数1(形参表) { 成员函数定义体; } template 类型形参表 返回类型 类名 类型名表::成员函数2(形参表) { 成员函数定义体; } … template 类型形参表 返回类型 类

文档评论(0)

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

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

1亿VIP精品文档

相关文档