C/C++模版类/函数

发布时间:2009年08月31日      浏览次数:931 次
模版与组合、继承可以完成强大的功能,模版也是C++ STL的基础。
类/函数模板提供了一种机制,通过它我们可以保留类/函数定义和函数调用的语义(在一个程序位置上封装了一段代码确保在函数调用之前实参只被计算一次)而无需像宏方案那样绕过C++的强类型检查。
函数模板提供一种用来自动生成各种类型函数实例的算法,程序员对于函数接口(参
数和返回类型)中的全部或者部分类型进行参数化parameterize ,而函数体保持不变。如用一个函数的实现在一组实例上保持不变,并且每个实例都处理一种惟一的数据类型,如函数min() ,则该函数就是模板的最佳候选者。例如,下面是min()的函数模板定义:
template <class Type>
Type min( Type a, Type b ) {
return a < b ? a : b;
}
int main() {
min( 10, 20 );
min( 10.0, 20.0 );
return 0;
}
关键字template 总是放在模板的定义与声明的最前面。关键字后面是用逗号分隔的模板参数表template parameter list ,它用尖括号(<> 一个小于号和一个大于号)括起来,该列表是模板参数表,不能为空。模板参数可以是一个模板类型参数template type parameter ,它代表了一种类型。也可以是一个模板非类型参数template nontype parameter,它代表了一个常量表达式。
模板类型参数由关键字class 或typename 后加一个标识符构成,在函数的模板参数表中,这两个关键字的意义相同。它们表示后面的参数名代表一个潜在的内置或用户定义的类型。模板参数名由程序员选择。在本例中我们用Type 来命名min()的模板参数但实际上可以是任何名字。譬如:
template <class Glorp>
Glorp min( Glorp a, Glorp b ) {
return a < b ? a : b;
}
函数定义或声明跟在模板参数表后。除了模板参数是类型指示符或常量值外,函数模板的定义看起来与非模板函数的定义相同。
当一个名字被声明为模板参数之后,它就可以被使用了,一直到模板声明或定义结束为止。模板类型参数被用作一个类型指示符,可以出现在模板定义的余下部分。它的使用方式与内置或用户定义的类型完全一样。模扳非类型参数被用作一个常量值,可以出现在模板定义的余下部分。它可以用在要求常量的地方,或许是 在数组声明中指定数组的大小或作为枚举常量的初始值。
模版声明和定义都要写在同一个.h文件中。
模版类可以继承,其成员函数可以有缺省参数。

下面给出一个具体例子:
MyStack.h
template<class T>
class MyStack
{
public:
MyStack(void);
~MyStack(void);
T value;
};
template<class T>
MyStack<T>::MyStack<T>(void)
{
}
template<class T>
MyStack<T>::~MyStack<T>(void)
{
}
---------------
Main.cpp
#include "MyStack.h"
void main()
{
dataList<int> list;
list.setValue(10);
}
免责声明:本站相关技术文章信息部分来自网络,目的主要是传播更多信息,如果您认为本站的某些信息侵犯了您的版权,请与我们联系,我们会即时妥善的处理,谢谢合作!