- 1、本文档共36页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)