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

第 6 章 模板;本章主要内容;程序设计中,当参与运算的数的不同值会随实际情况而变化时,就使用变量来代替这个数。同理,当处理的数据类型随实际情况变化时,可将数据类型作为可变的部分(参数)从程序中抽取出来。当出现真实的数据类型时,再用具体的数据类型代替; 模板就是为解决这个问题而产生的; C++中对数据进行处理的主体可以是函数,也可以是类,因此模板包括函数模板、类模板。;模板概述 ;模板;函数模板;模板声明格式: template 模板参数表 模板定义体 template为声明模板的关键词,声明一个参数化的类或函数集; “模板参数表”表示一个或多个模板参数,每个模板参数由关键字class和模板形参两部分组成,多个模板形参之间以“,”分割; 模板定义体是该模板的作用体,可以是函数或类的定义。;函数模板和模板函数 重载模板函数;请先看交换两??数据的函数例子:;上述swap函数是重载函数,它们的参数个数相同,实现算法相同,仅参数类型不同; 重载时需要分别定义不同参数类型的版本; 能否为上述的重载函数编写一个通用的算法的函数,使其使用多种数据类型?;函数模板给出了解决问题的办法:将数据类型抽取出来作为函数参数; 函数模板是一个通用函数,其函数类型和参数类型不具体指定,用一个“通用的”类型来代替; 凡是函数体相同的函数都可以用此模板代替,不必定义多个函数。;调用函数模板时,系统根据传递来的实参类型取代模板中的通用类型,实现不同的函数功能; 函数模板是对通用函数的描述,不是一个实在的函数,编译系统不会为其产生任何代码; 函数模板将函数要处理的某种特定的数据类型说明为参数,表示它能对通用的数据类型进行处理。 template 模板参数表 返回类型 函数名(参数表) { //函数定义体 }; ;函数模板中,template是关键字。模板参数是函数模板的参数化的数据类型,例如: template class T void swap(T n1, T n2) { T temp; temp=n1; n1=n2; n2=temp; } 函数模板只是说明,不能直接执行,需要实例化为模板函数后才能执行。;若编译系统发现以下调用:函数名(实参表),则用数据的实际类型代替参数表中的通用类型,并生成与函数模板定义的函数体相同的一个重载函数,即模板函数; 例如执行 “int a, b; swap(a,b);”后,将使类型形参T被实例化为整型int,同时产生如下的重载函数: void swap(int n1, int n2) { int temp; temp=n1; n1=n2; n2=temp; } 例6.2.1 函数模板应用举例。;在函数模板被实例化以前,必须先对函数模板进行声明(可能不进行定义)。 例6.2.2 :设计函数模板sortT,采用直接插入排序方式对数据进行排序,例如整数序列 和字符序列。;虽然函数模板中的模板形参T可以被实例化为各种类型,但实例化T的各个模板实参之间必须保持完全一致的类型,否则会出错; 例6.2.3:分析程序的运行结果。;对于个别实参类型不一致的情况,可以采用非模板函数重载模板函数的方法,即对个别类型重新定义一个非模板函数,有两种情况: 1、只声明 一个非模板函数的原型; 2、定义一个完整的非模板函数。;1、只声明一个非模板函数的原型;2、定义一个完整的非模板函数; 重载非模板函数要避免二义性;1. 寻找一个参数完全匹配的函数,如果找到了就调用它; 2. 失败后,寻找一个函数模板,使其实例化,产生一个匹配的模板函数,若找到了,就调用它; 3. 若1、2都失败了,再试一试低一级的对函数的重载方法,例如通过类型转换可产生参数匹配等,若找到了,就调用它。 4. 如果1、2、3都未找到匹配的函数,则是一个错误的调用。;函数模板和模板函数的区别:;模板:旨在于完成一些通用算法。采用模板功能后,即可在模板内将数据类型抽象为一种广泛类型,在忽略数据类型差异的情况下设计模板,只需要考虑具体算法。反之,用户使用模板时需要用特定的数据类型代替模板中的抽象数据类型,而不必考虑具体的算法; 函数模板:参数类型、返回值类型或函数体中使用的类型是通用类型的函数称为函数模板,它定义了一类函数。函数模板实例化可得到模板函数。模板函数的重载有两种方法。;本章主要内容;类模板与模板类的概念; 类模板的定义;例:templateclass T class database { T *data; int size; public: database (int); T operator[ ](int);

文档评论(0)

170****0532 + 关注
实名认证
内容提供者

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

版权声明书
用户编号:8015033021000003

1亿VIP精品文档

相关文档