- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第5章 模板
模板(templatetemple class T1, class T2, int M
表明template关键字下面定义的模板函数或模板类使用了两个数据类型T1、T2以及一个整型常量M。
编译程序在编译模板时,不会生成目标代码,只有当模板实例化时,才会用具体的数据类型和常量值来替换模板中的数据类型参数(如上面示例中的T1和T2)和常量(如上面示例中的M)并生成目标代码。
函数模板
如果在template关键字下面给出带有模板参数的函数定义,称为函数模板。
5.1.1函数模板的定义和实例化
例程5.1 实现两个变量交换值的函数模板。
#include iostream
using namespace std;
template class T
void SWAP(T a,T b){ T temp=a;a=b;b=temp;} //任意两个T类型变量交换值
void main()
{ double x=1.5,y=-0.98;
SWAP(x,y);coutx=x,y=yendl;
int m=10,n=20;
SWAP(m,n);coutm=m,n=nendl;
}
在例程5.1的函数模板中,可变类型参数(此处为标识符T)可以代表任何数据类型,包括类类型。本例中的SWAP模板函数,可以用于任何同类型数据对象交换值。对类变量,只要拷贝构造函数定义正确,交换值就能正确实现。
例程5.1的函数模板的实例化方法为隐式实例化。编译器遇到SWAP函数调用时,首先根据自变量的数据类型替换模板中的类型参数T来生成实例函数,然后调用该实例函数,实现两个变量交换值。
上例中,第一次调用SWAP函数时,实参x, y的数据类型为double,因此用类型名double代替标识符T,生成实例函数为:
void swap(double a,double a) { double temp=a;a=b;b=temp;}
第二次调用SWAP函数时,实参m, n的数据类型为int,因此用类型名int代替标识符T,生成的实例函数为:
void swap(int a,int b) { int temp=a;a=b;b=t; }
5.1.2 函数模板的重载
模板函数可以像普通函数一样实现重载。
例程5.2 重载模板函数:一维数组元素求最大值。
#include iostream
using namespace std;
template class ElemType
void GetMax(ElemType a[],int n,int i) //求最大值元素下标
{ int j;
i=0;
for(j=1;jn;j++) if(a[j]a[i]) i=j;
}
template class ElemType
void GetMax(ElemType a[],int n,int i,int j) //求最大和第二大值元素的下标
{ int k;
i=0;j=1;if(a[i]a[j]) { i=1;j=0; }
for(k=2;kn;k++)
if(a[k]a[i]) { j=i;i=k; }
else if(a[k]a[j]) j=k;
}
float GetMax(float a[],int n)
{ int i;float max=a[0];
for(i=1;in;i++) if(a[i]max) max=a[i];
return max;
}
void main()
{ float a[8]={ 0.8f,-2.5f,9.6f,7.2f,3.4f,-1.7f,8.8f,-5.2f };
int i,j;
GetMax(a,8,i);cout最大值=a[i]endl;
GetMax(a,8,i,j);cout最大值=a[i],第二大值=a[j]endl;
float max=GetMax(a,8);cout最大值=a[i]endl;
}
首先,寻找一个参数完全匹配的函数,如果找到了就调用它;
其次,寻找一个函数模板,把它实例化产生一个匹配的模板函数,如果找到了就调用它;
最后,如果以上两步都失败,则试一试重载函数,在实参类型自动转换后尝试调用它;
以上均不成功,则编译失败。
5.1.3 显式指定模板参数实现函数模板的实例化
在例程5.1和5.2中,函数模板在实例化时C++根据模板函数自变量的数据类型自动决定模板参数。C++还允许直接指定函数模板的参数实现实例化,即显式实例化调用模板函数,其格式为:
函数名类型名和常量表达式列表(实参表);
例程5.3 函数模板的显示实例化。
#include iostream
using na
文档评论(0)