文档介绍:
函数模板说明
使用函数模板
用户定义的参数类型
类模板说明
使用类模板
第10章模版
华北电力大学计算机系
问题引入:
int abs(int x)
{
if(x<0)
return –x;
else
return x;
}
float abs(float x)
{
if(x<0)
return –x;
else
return x;
}
T abs(T x)
{
if(x<0)
return –x;
else
return x;
}
很多情况下,设计的算法可处理多种数据类型
通用代码
华北电力大学计算机系
函数模板
函数模板可定义一个对任何类型变量操作的通用函数
普通函数vs函数摸板
普通函数只能传递变量参数
函数模板提供了传递类型的机制
步骤
定义函数模板
实例化成相应的模板函数进行调用执行
函数模板说明
使用函数模板
用户定义的参数类型
华北电力大学计算机系
函数模板说明
template <类型形参表>
<返回类型><函数名>(形参表)
{
//函数定义体
}
template <class T>
T abs( T x )
{
if(x < 0)
return –x;
return x;
}这样的函数模板定义不是一个实实在在的函数,编译系统不为其产生任何执行代码
即模板参数表
class 标志符可以是基本数据类型,也可以是自定义类型。
一个或多个模板参数,每个都要写class,逗号分隔。
<函数定义体>中至少出现一次
函数体同一般函数定义一样
华北电力大学计算机系
使用函数模板
,不能直接执行,
需要实例化为模板函数后才能执行。
template <class T>
T abs( T x )
{
if(x < 0) return –x;
return x;
}
:abs(10);
,所以实例化为以下真正的函数:
int abs(int x)
{
if(x < 0) return -x;
return x;
}
(10);
华北电力大学计算机系
函数模板定义:
(T:形参,
通用数据类型)
template <class T>
T abs(T x)
{
if(x < 0) return –x;
return x;
}
生成模板函数:
(int类型是函数模板的参数T的实参,也是函数调用时的形参的类型)
int abs(int x)
{
if(x < 0) return -x;
return x;
}
模板函数调用:
abs(10);//10为模板函数的实参
华北电力大学计算机系
【】
#include <>
template <class T>
T min(T x,T y)
{
if(x<y) return x;
else return y;
}
void main()
{
int n1=2, n2=10;
double d1=, d2=;
cout << "较小整数:" << min(n1,n2) << endl;
cout << "较小实数:" << min(d1,d2) << endl;
}
实例化min模板函数来比较两个双精度数
实例化min模板函数来比较两个整数
本程序的执行结果如下:
较小整数:2
较小实数:
华北电力大学计算机系
函数模板的实例化
函数模板
T min(T x,T y)
生成模板函数
int min(int n1,int n2)
模板函数
double min(double d1,double d2)
实例化
实例化-当编译器发现有函数调用:
<函数名>(<实参表>);
根据<实参表>中的类型,生成一个模板函数
(函数模板的实例)
模板函数调用
min(2,10)
函数模板——模板的定义,通用的类型参数
模板函数——实实在在的一个函数定义
是由编译系统遇到具体函数调用时生成的
定义体与函数模板的函数定义体
华北电力大学计算机系
注意
函数模板的说明和定义必须是全局作用域。
模板不能被说明为类的成员函数。
函数模板有一个特点,虽然模板参数T可以实例化成各种类型,但是采用模板参数T的各参数之间必须保持完全一致的类型。
华北电力大学计算