我们知道在C++中模板可以分为类模板与函数模板,在以前的文章中介绍了函数模板。本文本文以栈类Stack与链表类Clink为例介绍一下类模板。
首先模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。目的就是减少代码的重复量,解放C++程序员的生产力。
类模板的定义
template<class T>
class Stack
{
public:
Stack();
~Stack();
void Pop();
void Push();
T Gettop();
private:
T *mdata;
int top;
}
构造函数和析构函数的函数名称建议省略模板参数,其他不建议省略
这里特别注意:这个类的类型是Stack< T >,其中T是模板参数。因此,当在声明中需要使用该类的类型时,你必须使用Stack< T >。然而,当使用类名而不是类的类型时,就应该只用Stack;譬如,当你指定类的名称、类的构造函数、析构函数时,就应该使用Stack。
成员方法的实现
类模板的成员方法在类外实现时,为了定义类模板的成员函数,必须指定该成员函数是一个函数模板,而且你需要使用typename 声明后面类型属于模板。在类中实现时,相当于内联函数。类模板成员函数本身也是一个模板,类模板被实例化时它并不自动被实例化,只有当它被调用或取地址,才被实例化。
template <typename T>
void Stack<T>::Push(T val)
{
if(!Full())
{
mdata[++top]=val;
}
}
友元关系
友元类需要一对多
友元模板一对一
类模板的实例化
类模板是选择性实例化
类模板什么时候会被实例化呢?
- 当使用了类模板实例的名字,并且上下文环境要求存在类的定义时。
- 对象类型是一个类模板实例,当对象被定义时。此点被称作类的实例化点。
- 一个指针或引用指向一个类模板实例,当检查这个指针或引用所指的对象时。
类模板的特例化
类模板的特例化分为完全特例化和部分特例化,特例化主要是是针对类型
成员中只要少部分成员不满足特殊类型的需求,针对部分函数进行特例化。
成员中大部分成员不满足特殊类型的需求,针对类模板实现类模板的全特化。