C++模版
C++中的模版只要是为了代码重用,模版是为不同类型的变量实现同样的功能,主要分为函数模版和类模版。
和重载的区别和联系:重载是为了不同类型的参数调用不同的函数,并没有代码重用的目的。但是,模版的本质就是重用,在编译阶段,编译器一旦发现使用了某个模版,则针对这个数据类型生成目标代码(模版函数),然后调用之。
函数模版
如printArray()函数用于打印数组,对于不同数据类型的数组次函数的功能几乎相似,如果不使用模版,可使用同样的函数名不同的参数通过重载的形式。而通过函数模版我们只要编码一个函数,编译器会帮助我们自动重载。
使用方法:在函数头前面加上template<typename T>,T是模版类型,用于指定函数实参类型、函数返回值类型或者函数中的变量。
如template<typename T>,或者template<class ElementType>
类模版
在一个实现某个功能类中,希望支持不同的成员变量的类型,比如堆栈类,栈内的元素可以是int型或者float型等等,但是基本的功能是相似的。
使用方法:在类声明前面同样加上template<typename T>。如
[cpp]
template<typename T>;
class Stack{
private: T *stackPtr;
public:
bool pop(T& t);
}
[/cpp]
在类的成员函数的定义时,也需要在前面加上template<typename T>。如:
[cpp]
template<typename T>
bool Stack<T>::pop(T &popValue){
…
}
[/cpp]
实例化一个对象就可以通过:Stack<double> doubleStack(4);
类模版中,可以使用非类型参数和默认类型参数。
非类型参数表示模版形参可以是一个int值,如template<typename T, int elementcout>,使用一下声明:Stack<double,100> hundst;这样,编译时直接把100编译进去。
默认类型参数如template<typename T=string>。声明:Stack<> somestack;
除此以外,如果要存储用户定义的类型,必须提供一个默认的构造函数和重载的赋值运算。如果特定的用户定义类型不能使用通用类模版或有其他特殊处理,可使用显示定义类模版的形式特化。
附:模版和友元的关系以及和静态成员的关系,只要记住模版在编译阶段会根据不同的typename特化为不同的代码。