- 1、本文档共35页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
13.面向对象程序设计课件
模 板; 考虑:返回两个参数中较大者的函数
max(x,y)。x,y是具有可比较次序的任何类型。但是,C++是强类型语言,它要求参数x,y的类型在编译时就声明。这样就需要max( )函数的许多版本,每个版本的算法相同,形参代表的数据类型不相同。
int max(int x,int y);
long max(long x,long y);
…….等等
针对这种情况,采用函数模板,只需对函数模板编写一次,然后基于调用函数时提供的参数类型,C++编译器将自动产生相应的函数来正确处理该类型的数据。; 函数模板的定义形式是:
templateclass T或templatetypename T
类型名 函数名(参数表)
{ 函数体的定义 }
模板头以关键字template开始,后面跟尖括号中的一个或多个模板形式参数。模板参数可以是类型,也可以是非类型的数据。
1 类型参数:特殊的表示法“class T”或“typename T”表示T是一个类型参数,它可以给定任何类型作为值。在标准C++中关键字“class”和“typename”可以交换。
2 非类型参数:正常格式的参数。例:int k
;例如:
templateclass T
T max(T x,T y)
{ return (xy)?x:y ;}
void f( )
{ int i;
Myclass a,b;
int j=max(i,0); //模板实参为整型
Myclass m=max(a,b); //模板实参为Myclass
}
;这里生成了两个模板函数max(i,0)和max(a,b)
max(i,0)用模板实参int将类型参数T实例化,而max(a,b)将T实例化为类类型Myclass。注意编译器将根据上下文关系非常仔细地调用适当的“”,根据运算符重载,在Myclass类声明中,应提供一个重载的operator( )函数。; templatetypename T
T power(T a,int exp)
{ T ans=a;
while(--exp0) ans*=a;
return ans; }
templatetypename T,int N
T max(T arr[N])
{ T ans=arr[0];
for(int i=1;iN;i++)
ans=(ansarr[i])?ans:arr[i];
return ans; }; main( )
{ int i=5,j=2;
double b=1.25;
coutpower(j,i)endl; //T是int
coutpower(b,i)endl; //T是double
int a[]={1,2,3};
coutmax(a)endl; //T是int,N=3
}; 注意:模板参数在下面的两个声明中没有区别
templatetypename T1,typename T2
int function(T1,T2);
templateclass T1,class T2
int function(T1,T2);
; 一个函数模板提供一类函数的抽象,它以任意类型T为参数。由一个函数模板产生的函数称为模板函数,它是函数模板的具体实例。(类似于类与对象的关系)
; 重载函数模板
在一些特殊情况下,可能需要函数模板参与重载,C++允许函数模板被一个或多个同名的非模板函数重载。
templateclass T
T max(T a,T b)
{ return (ab)?a:b; }
void f(int i,char c )
{ max(i,c); } //错误!max(int,char)无法匹配
问题在于模板类型并不知道int和char之间可以进行隐式类型转换。为了解决这个问题,C++允许函数模板可以参与重载;在C++中,函数模板与同名的非模板函数的重载方法遵循以下约定:
(1) 寻找一个参数完全匹配的函数,若找到,就调用它
(2) 寻找一个函数模板,将其实例化产生一个匹配的模板函数,如果找到,就调用它。
(3) 寻找低一级的对函数的重载方法,若通过类型转换可产生参数匹配的函数,就调用它。
若 (1)(2)(3)均未找到匹配
文档评论(0)