类模板与模板类的概念
1. 什么是类模板
一个类模板(也称为类属类或类生成类)同意用户为类定义一种模式。使得类中的某些数据成员、默写成员函数的參数、某些成员函数的返回值,能够取随意类型(包含系统提前定义的和用户自己定义的)。
2. 类模板定义
定义一个类模板,一般有双方面的内容:
A. 首先要定义类,其格式为:
template <class T>
class foo
{
……
}
foo为类名,在类定义体中,如采用通用数据类型的成员,函数参数的前面需加上T。
通用类型 T 能够作为普通成员变量的类型,还能够作为const和static成员变量,以及成员函数的參数和返回类型。
比如:
template<class T>
class Test
{
private:
T n;
const T i;
static T cnt;
public:
Test():i(0){}
Test(T k);
~Test(){}
void print();
T operator+(T x);
};
B. 在类定义体外定义成员函数时:若此成员函数中有模板参数存在,则除了须要和一般类的体外定义成员函数一样的定义外,还需在函数体外进行模板声明。比如:
template<class T>
void Test<T>::print()
{
std::cout<<"n="<<n<<std::endl;
std::cout<<"i="<<i<<std::endl;
std::cout<<"cnt="<<cnt<<std::endl;
}
假设函数是以通用类型为返回类型,则要在函数名前的类名后缀上“”。比如:
template<class T>
Test<T>::Test(T k):i(k)
{
n=k;
cnt++;
}
template<class T>
T Test<T>::operator+(T x)
{
return n + x;
}
C. 在类定义体外初始化const成员和static成员变量的做法:和普通类体外初始化const成员和static成员变量的做法基本一样,唯一的差别是需再对模板进行声明,比如
template<class T>
int Test<T>::cnt=0;
template<class T>
Test<T>::Test(T k):i(k)
{
n=k;
cnt++;
}
3. 类模板的使用
类模板的使用实际上是将类模板实例化成一个详细的类。它的格式为:类名<实际的类型>。
模板类是类模板实例化后的一个产物。说个形象点的样例吧。
我把类模板比作一个做饼干的模子,而模板类就是用这个模子做出来的饼干,至于这个饼干是什么味道的就要看你自己在实例化时用的是什么材料了,你能够做巧克力饼干,也能够做豆沙饼干,这些饼干的除了材料不一样外,其它的东西都是一样的了。