c++中的模板貌似在java中没有,但是java有泛型,不知道c++有没有,后面会继续学习。模板的意思,就是说有一个原型,使用的时候只要按照原型的定义使用即可。是原型哦,可不是类型,所以模板把类型复杂的问题给解决了。这里有必要说一下函数重载,函数重载是针对同样的函数名,我们定义不同类型的形参,针对不同的形参,实现不同的函数逻辑。但是模板呢?是针对所有的类型,我们定义一个函数即可。这样的话,也就是说模板,只有一个函数定义,针对多种类型进行同样的逻辑处理。
模板,分为两种,函数模板和类模板。早就听说了c++模板功能强大。现在证实一下。
函数模板
函数模板的定义使用如下格式即可:
template <class T> T getMax(T t1,T t2)
这样,在使用的时候,我们直接实现该函数的逻辑即可,避免了对类型的处理,如果T是对象类型肿么办,那么需要操作符重载了来实现特有逻辑了。看看下面的代码:
#include <iostream>
using namespace std;
template <class T> T getMax(T t1,T t2);
template <class T> T getMin(T t1,T t2);
template <class T,class U> T sum(T t1,U u1);
int main()
{
int a=1,b = 2,c;
double d1 = 1.2, d2 = 1.3;
c = getMax(a,b);
cout << c << endl;
c = getMin(a,b);
cout << c << endl;
cout << sum(a,d1) << endl;
return 0;
}
template<class T> T getMax(T t1,T t2)
{
if(t1 > t2)
return t1;
return t2;
}
template <class T> T getMin(T t1,T t2)
{
if(t1 > t2)
return t2;
return t1;
}
template <class T,class U> T sum(T t1,U u1)
{
return t1+u1;
}
在这里我们定义了取最大值,最小值,加法运算的函数。每一个声明或定义之前,都需要加上模板的定义才可以。另外,针对sum函数,之所以有T,U,是说sum函数可以同时传入两种不同类型的实参。返回值是T,当然,我们可以根据需要,写成U也可以啦。看看运行结果的截图吧,结果为什么会这样,我就不说了。
类模板
#include <iostream>
using namespace std;
template <class T1,class T2>
class base
{
private:
T1 x;
T2 y;
public:
base();
base(T1 a,T2 b);
show();
};
template <class T1,class T2>
base<T1,T2>::base()
{
x = 1;
y = 2;
}
template <class T1,class T2>
base<T1,T2>::base(T1 a,T2 b)
{
x = a;
y = b;
}
template <class T1,class T2>
base<T1,T2>::show()
{
cout << "x = " << x << endl;
cout << "y = " << y << endl;
}
int main()
{
base<int,int> *t = new base<int,int>(5,10);
t->show();
delete t;
return 0;
}
上面的代码定义了一个base类,base类中有两个私有成员变量,变量的类型是不确定的,模板化的。同样,在构造函数中,也可以使用模板化的参数。需要注意的是,我们在实现每个类的方法时,需要将每个方法前都加上模板化的声明。我们看看这个代码的执行结果吧: