类模板与函数模板非常相似:同样是先由你编写一个类的模板,再由编译器在你第一次使用这个模板时生成实际代码。
template<class T> class MyClass { MyClass();//构造函数 void swap(T &a, T &b); }
构浩器的实现将是下面这样:
MyClass<T>::MyClass() { //初始化操作。 }
因为MyClass是一个类模板,所以不能只写出MyClass::MyClass(),编译器需要你在这里给出一种与MyClass(配合使用的数据类型,必须在尖括号里提供它。因为没有确定的数据类型可以提供,所感用一个T作为占位符即可。
接下来的示例程序将随这一切更加明朗。我们即将编写一个基于模板的栈。栈是实际编程过程中一种非常有用的数据结构,它是一种数据存储机制。栈只提供两个函数:一个用来把数据压入栈的顶部,另一个用来从栈取出顶部元素(先进后出)。
#include <iostream> #include <string> template <class T> class Stack { public: Stack(unsigned int size = 100); ~Stack(); void push(T value); T pop(); private: unsigned int size; unsigned int sp;//栈指针,指栈内当前第几个数据 T *data;// 栈的指针,指栈在内存中的位置 }; //类的实现 //构造器 template <class T> Stack<T>::Stack(unsigned int size) //参数默认值为100 { this -> size = size; data = new T[size]; sp = 0;//栈默认栈指针指向栈底 } //析构器 template <class T> Stack<T>::~Stack() { delete []data; } template <class T> void Stack<T>::push(T value) { data[sp++] = value; } template <class T> T Stack<T>::pop() { return data[--sp]; } int main() { Stack<int> intStack(100); intStack.push(1); intStack.push(2); intStack.push(3); std::cout<< intStack.pop() << " "; std::cout<< intStack.pop() << " "; std::cout<< intStack.pop() << " "; return 0; }