c++之模板
引入模板的作用:避免代码的重复,编写脱离数据类型的通用模板。
模板是对类型进行参数化的工具,是c++中支持参数化多态的工具。
模板的分类:函数模板、类模板
下面依次介绍函数模板和类模板。
函数模板:
template <class T> or template <typename T> //模板声明格式
返回值类型 函数名(模板形参表)
{
函数体
}
函数调用:
函数名(模板实参表) //和普通的函数调用没有区别,只不过运行时,系统会首先根据参数类型确定数据类型,生成一个模板函数</span>
下面介绍一个使用函数模板的实例
template <typename T>
T square(T x)// template 语句 和 函数模板定义语句不允许有别的语句
{
T result;
result = x * x;
return result;
};
void main()
{
int i, ii;
float x, xx;
double y, yy;
i = 2;
x = 2.2;
y = 2.2;
ii = square<int>(i);
cout << i << ": " << ii << endl;
xx = square<float>(x);
cout << x << ": " << xx << endl;
yy = square<double>(y);// 显式使用模板
cout << y << ": " << yy << endl;
yy = square(y);//隐式使用模板
cout << y << ": " << yy << endl;
return ;
}
注意:
1)模板函数调用时,可以有显式和隐式的调用。
2)模板声明格式包含以下两种:template <class T> or template<typename T>
3)模板的声明和定义必须在同一个文件中,如头文件。
4)在模板函数的定义中,T代表数据类型。
5)c语言的宏定义也可以实现函数模板的功能,如#define f(x) ((x)*(x)) 但是宏定义没有类型检查,函数模板有类型检查。
模板函数运行过程分为两部分:1)传递参数类型,用模板实参将类型参数T进行实例化。2)传递参数,将参数传递给函数。
函数模板使用过程中,出现的一些特殊的情况
1)函数模板可以使用多个模板参数,有几个不同的类型,就用不同的模板参数来代表它。
template <class T,class D>
T max(T a,D b)
{
return (a>b)?a:b;
}
void main()
{
float a = 4.5;
int b = 100;
cout<<max(100,154.5)<<endl;
cout<<max(154.5,100)<<endl;
}
2)重载一个函数模板:定义一个模板后,再定义一个重载函数
template <class T>
T maxim(T a,T b)
{
return (a>b)?a:b;
}
int maxim(int a ,int b)
{
return (a>b)?a:b;
}//用户自己定义一个同名函数
void main()
{
int m,n;
m = 10;
n = 20;
char a = 'a',b = 'b';
char s[10];
cout<< maxim(m,n)<<endl;//调用函数 实参和函数的参数类型完全一致,直接调用函数
cout<<maxim(a,b)<<endl;//调用模板 实参和函数参数类型不同,直接调用模板
cout<<maxim(m,a)<<endl;//调用函数 实参的类型不同,模板不适合,则再次调用函数
cout<<maxim(m,s)<<endl;//报错-函数也不适合,直接报错
}
上面调用函数的顺序是,先调用函数-其次调用模板函数-再次调用函数。最后如果都不能调用,就直接报错