第12章 泛型机制mdash;模板.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文档。上传文档
查看更多
第12章泛型机制amp;mdash;模板.ppt

第12章 泛型机制—模板 本章学习要求: 泛型的基本概念 函数模板和类模板的实现 C++标准模板库 * * 12.1 泛型程序设计的概念 在程序设计中经常还需要用到这样的程序实体(如:类和函数等):这些程序完成的功能完全相同,但他们所操作的数据的数据类型不同。例如,下面讨论对一个数组中的元素进行排序,但数组中的元素类型不同。 void int_sort(int array[], int num); //num表示元素个数 void string_sort(string array[], int num); void int_sort(int array[], int num); 若采用相同的排序算法,则内部他们处理的流程基本相同 若能够在编码阶段分别只是用一个函数和类就能够描述它们的功能,运行时,通过使用不同的实际类型带入,来处理不同类型的数据,将会大大简化程序的设计和编码工作。在这种思想里,大部分基本算法被抽象,独立于与其所操作的数据,用于以相同或相近的方式处理各种不同类型的数据,甚至是目前未知类型的数据。在程序设计中,一个程序实体的这种能对多种类型的数据进行操作或描述的特性称为泛型(或类属)。基于泛型思想进行的程序设计称为泛型程序设计(Generic Programming)。 12.2 函数模板 函数模板的定义 函数模板是指带有类型参数的函数,语法如下: template class T1, class T2, ...... 返回值类型 函数名(参数列表){ ...... } 其中,T1、T2等是函数模板的模板参数,在调用该函数时将指定T1、T2对应的实际类型。在返回值类型、参数列表和函数体内都可以使用T1、T2等作为类型,只是此时不知道是何具体类型。 编写一个函数whichMax,判断并返回两个参数中最大的。 template class T1 T1 whichMax(T1 a, T1 b){ return (ab ? a:b); } 2. 函数模板的调用 调用通过函数模板定义的函数时,需要提供相应的具体的类型。格式为: 函数名类型名1,类型名2,……(实参列表) 这里的类型名1、类型名2等将分别替换函数模板定义中的模板参数T1、T2,…… 如要判断两个数字谁最大,可以采用如下调用: int main(){ int a=3, b= 4; int m = whichMaxint(3,4); //判断两个int类型数据的大小关系 double d = 3.14, d2= 4.5; double dm = whichMaxdouble(d, d2); //判断两个double类型数据的大小关系 } 也可以不显示提供函数模板中T1、T2等所对应的实际类型,而由编译器在调用时,根据实参类型来判断,如: int m = whichMax(3,4); 编译器将分析出3,4为int类型,因此,将采用int替换掉T1。 int m = whichMax(3.1,4.3); 编译器将分析出3.1,4.3为double类型,因此,将采用double替换掉T1。 当然,若不显示提供函数模板中的类型参数,则必须要编译器能够从实参中推导出模板中的类型参数,建议在调用时,显示提供模板的类型参数。 3.函数模板的实例化 实际上,函数模板定义了一系列的重载函数,因为函数名都相同。要使用函数模板所定义的函数(称为模板函数),首先必须要对函数模板进行实例化(生成具体的函数)。编译器在遇到某个函数的调用时,将使用显示指定的或根据实参推导出的类型实例化函数模板,生成具体的函数代码,再生成对具体函数的调用。这个确定函数模板实例的过程叫模板实例推演。 如: int a=3, b= 4; int m = whichMaxint(a,b); 编译器将使用int类型带入函数模板中生成具体的函数: int whichMax(int a, int b){ return (ab ? a:b); } “whichMaxint(a,b);”在内部将调用该函数。 4.函数模板的非类型参数 在template中,除了类型参数外,还可以有非类型参数,如: template class T1, int esize void g( T1 a){ T1 temp[esize]; ...... } 要使用该函数模板,必须显示指定模板参数,调用为: fint, 10(); 5.函数模板重载 有时,为了弥补函数模板所缺乏的灵活性,需要把函数模板与函数重载结合起来使用,例如:在函数模板whichMax中,若调用为: char *s1 = aa; char *s2 = bb; whichMax(s1, s2); 试图对字

文档评论(0)

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

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

1亿VIP精品文档

相关文档