第六章模版
模板是C++软件复用的功能之一
模板可以使我们用一个代码段指定一组相关(重载)函数(称为模板函数)
或一组相关类(称为模板类)
类似一个函数或一个类
更抽象:参数和返回值的类型可以变
----宏
例子:
int max(int x,int y){
return (x>y)?x:y;
}
float max(float x,float y){
return(x>y)?x:y;
}
double max(double x,double y){
return(x>y)?x:y;
}
解决方法之一:
#define max(x,y)((x>y)?x:y)
弊端一:
宏检验不严格。由于在宏中无需说明类型,因此可能会产生x与y的不同类
型变量之间的比较,这可能不会出错,可能会产生一个严重错误。
#include ""
#define max(x,y)((x>y)?x:y)
int main(){
int x1=1,y1=2;
cout<<max(x1,y1)<<endl;
int x2=3;char y2=4;
cout<<max(x2,y2)<<endl;
}
弊端二:宏可能会替换了不该替换的地方:
#define max(x,y)((x>y)?x:y)
class sample{
public:
int i;
int max(int,int);
};
int main(){
int x1=1,y1=2;
cout<<max(x1,y1)<<endl;
int x2=3;char y2=4;
cout<<max(x2,y2)<<endl;
}
max(int i,int j){
return (i>j?i:j);
}
以前也讲过由于宏操作的不严格,导致了不少麻烦(第一讲、用const)
解决宏替换可能会造成的潜在的问题,可以用另一种方法实现软件复用或代码重用
——模板。
1、函数模板的声明格式:
template <class type>
返回类型函数名(参数表)
{
…
}
template是一个关键字,用来声明一个模板
关键字class的type是模板的形参
模板的形参在使用时被实例化为实际的数据类型
例子:上例中最大值函数max()转换成函数模板
template <class T>
T max(T x,T y)
{
return (x>y)?x:y;
}
·在这个例子中T成为模板形参
·模板形参可以为系统预定义数据类型,如int,float,char等,也可以是用户自定义的数据类型。
·由于在模板中将可能变化的参数类型用模板形参来代替,这样max函数模板就代表了一类函数。
·要真正使用max,就必须先将模板形参转换成确定的数据类型,这个转换的过程称为模板的实例化。
例子:模板的实例化与形参类型确定
template <class AT>
AT max(AT x,AT y){return (x>y)?x:y;}
void main(){
int x1=1,y1=2;
cout<<max(x1,y1)<<endl;
float x3=,y3=;
cout<<max(x3,y3)<<endl;
char x4='a',y4='b';
cout<<max(x4,y4)<<endl;
int x2=3;char y2=4;
cout<<max(x2,y2)<<endl; //错误,说明检验比较严格
} //VC中出错,不同编译器不同对待
在上例中,一个函数模板max(x,y)实例化了3个模板函数:
整型: max(x1,y1)
浮点型:max(x3,y3)
字符型:max(x4,y4)
另一个例子:
template <class AT>
AT sum(AT *array,int size=0){
AT total=0;
for (int i=0;i<size;i++) total+=array[i];
return total;
}
int int_array[]={1,2,3,4,5,6,7,8,9,10};
double double_array[]={,,,,,,,,,};
int main(){
int itotal=sum(int_array,10); //实例化
double dtotal=sum(double_array,10); //实例化
cout<<"Integer Summary: "<<
c 课件:第六章 来自淘豆网m.daumloan.com转载请标明出处.