类模板,实际上是建立一个通用类,其数据成员,成员函数的返回类型和形参类型不具体指定,用一个虚拟的类型来代表。使用类模板定义对象时,系统会根据实参的类型来取代模板中虚拟类型从而实现了不同类的功能。
template<typename 参数类型>
class 类名
{
类成员声明
};
或
template<class 参数类型>
class 类名
{
类成员声明
}
与函数模板类似,template只是一个声明模板的关键字,它表明声明一个模板。类型参数实际上时一个虚拟的类型名,现在并未指定他是哪一种具体的类型,但使用类模板时,必须将类型参数实例化。虽然template<class 参数类型>与template<typename 参数类型>作用一致但是建议使用template<typename 参数类型> class容易和类混淆。
举例:
template<typename T>
class Max
{
private:
T x;
T y;
public:
Max(T a, T b)
{
x = a;
y = b;
}
T Min();
void Show()
{
cout << x << '\t' << y<<endl;
}
};
template<typename T>
T Max<T>::Min()
{
return x < y ? x : y;
}
int main()
{
Max <int>Num1(1, 2);
Max <double>Num2(1.1,2.2);
Num2.Min();
Num1.Show();
Num2.Show();
return 0;
}
在创建对象之后可以将类模板理解为如下
class Max<int>
{
typedef int T
private:
T x;
T y;
public:
Max(T a, T b)
{
x = a;
y = b;
}
T Min();
void Show()
{
cout << x << '\t' << y<<endl;
}
};
有几个细节需要注意一下
1用类模板定义对象时采用一下形式:
类模板名<实际类型名>对象名[(实参列表)];
2.类模板中成员函数在在类模板体外定义,但成员函数中类型参数存在则有一下规定
( 1) 需要在成员函数定义之前进行模板声明
(2)在成员函数名前写上“类名<类型参数>::”
3.在每个类模板定义之前都需要在前面加上模板声明
4.模板类同模板函数一样也可以有多个类型参数