函数模板
定义:函数模板不是真正的函数,编译器无法生成可执行代码。 定义函数模板后,它只是函数功能框架的说明,具体执行时,功能将根据传递的实际参数来确定。
一般形式:
template类型格式参数表返回类型函数名称(格式参数表)
{
… //函数体
}
函数模板分为template和函数名称
template
voidfun(tt ) )。
{
… //函数的实现
}
示例:合计函数模板
定义模板//模板类型
typesum(typexvar,type yvar )//函数模板定义
{
return xvar yvar;
}
调用程序中的模板
intiret=sum (10,20 );//实现两个整数相加
doubledret=sum(10.5、20.5 );//实现两个实数相加
函数模板的作用
调用模板时,将正确计算整数和实数的最大值。
重载函数模板
整数类型数和实数类型数编译器可以直接比较,所以也可以直接使用函数模板进行比较,但是如果是字符指针指向的字符串,该如何进行比较呢? 答案是通过重新加载函数模板来实现的。 字符串通常需要库函数进行比较,通过重载函数模板实现字符串的比较。
程序是重载的函数模板min的实现,它使用strcmp库函数进行字符串比较。 此时,可以使用min函数比较整数数据、实数数据、字符数据和字符串数据。
类模板
定义和声明类模板
可以使用template关键字不仅定义函数模板,还定义类模板。 类模板表示类的族,是一种用于描述通用数据类型或处理方法的机制,它允许类中的某些数据成员和成员函数的参数或返回值具有任何数据类型。 类模板可以说是在类中生成类,减少类的定义数量。
类模板的一般定义格式如下。
template类型格式参数表class类模板名称
{
… //模框体
(;
类成员函数的定义格式如下。
template型格式参数表
类型类模板名称返回类型名称:成员函数名称(格式参数列表) ) )。
{
… //函数体
}
template是关键字,类型格式参数表与函数模板定义相同。 定义类模板的成员函数时的类模板名称必须与定义类模板时的名称一致。 类模板不是真正的类,需要重新生成类。 生成类的格式如下。
模板名称类型实际存在参数表
在新生成的类中定义对象的格式如下:
模板名称类型实际存在参数表对象名称
例如:
将模板类的参数设置为整数,然后在模板类中声明对象。 代码如下所示。
容器我的容器; 声明Container类对象
声明对象后,可以调用类成员函数,如下所示:
int i=10;
mycontainer.insert(I;
简单的类模板
类模板中的类型化参数表可以在运行时指定,也可以在定义类模板时指定。 让我们来看看在运行时如何指定类型参数。
默认模板参数
默认模板参数是类模板定义时在类型化参数表中设置的类型参数的默认值。 此缺省值为数据类型,如果有缺省数据类型参数,则在定义模板的新类时可以不指定。