C++模版

Published: 03 Mar 2013 Category: 编程

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特化为不同的代码。