[综合应用能力c类万能模板]「C++ 」函数模板

事业单位考试网(sydw.cn)最新考试信息:[综合应用能力c类万能模板]「C++ 」函数模板,包含报名时间及入口、考试时间、笔试内容等信息,更多综合应用能力请查看:综合应用能力

  

在上一篇文章中写道“C++ 程序由类和函数组成,模板也分为类模板 (class template)函数模板(function template)。在说明了一个函数模板后,当编译系统发现有一个对应的函数调用时,将根据实参中的类型来确认是否匹配函数模板中对应的形参,然后生成一个重载函数。该重载函数的定义体与函数模板的函数定义体相同,称为模板函数 (template function)。”

所以接下来说一说函数模板,函数模板可以将函数参数和返回值的类型全部或部分地参数化,提供一个与类型无关的算法

函数模板的定义方法如下:

template <<模板参数表>>

<返回类型><函数名>(<函数参数表>)

{<函数体>}

其中,template 是关键字,模板参数表用一对尖括号括起来,内有一个或多个模板参数不能为空。

当根据函数模板调用函数时,系统会根据函数的实参计算出模板类型参数和模板非类型参数的实参,这个过程被称为“模板实例化”。如果计算成功,模板类型参数将被实际的类型所代替,模板非类型参数将被常量值所代替,生成一个针对某种类型的函数实例。

模板函数有一个特点,虽然模板参数T可以实例化成各种类型,但是采用模板参数T的各参数之间必须保持完全一致的类型。模板类型并不具有隐式的类型转换,如在 int 与 char之间、float 与int 之间、float 与 double 之间等的隐式类型转换。而这种转换在 C++ 中是非常普遍的。

例如,编写一个对具有 n 个元素的数组 a[ ]求最小值的程序,要求将求最小值的函数设成函数模板。如程序219.cpp 所示。

//案例名称: 使用函数模板
//程序名称: Proj2 19.cpp
#include<iostream>
template<class T>
T min(T a[] , int n)
{
int i;
T minv=a[0];
for(i=1; i<n ;i++)
{
if(minv>a[i])
minv=a[i];
}
return minv;
}
int main()
{
int a[]={1,3,0,2,7,6,4,5,2};
double b[]={1.2,-3.4,6.8,9,8};
std::cout<<"a 数组的最小值为:"<<min(a,9)<< std::endl;
std::cout<<"b 数组的最小值为:"<<min (b,4)<<std::endl;
return 0;
}

程序执行的结果如图 2-19 所示

图2-19 执行结果

函数模板方法克服了 C 语言解决上述问题时用大量不同函数名表示相似功能的坏习惯;克服了宏定义不能进行参数类型检查的弊端;克服了 C++ 函数重载用相同函数名重写几个函数的烦琐。因而,函数模板是 C++ 中功能最强的特性之一,具有宏定义和重载的共同优点,是提高软件代码重用率的重要手段。

模板函数与普通函数一样,也可以重载。并不是所有被成功定义的重载函数模板都能够被成功调用,在调用时可能会发生二义性错误,也就是说,对于一个函数调用可能会有多个函数模板被实例化。重载方法如程序220.cpp 所示。

//案例名称:使用函数模板
//程序名称: 220.cpp
#include<iostream>
using namespace std;
template<class T>
T min1(T x,T y)
{
cout<<"调用min1(T x,T y),最小值为";
return x>y ? y:x;
}
template <class T>
T min1(T a[] ,int n)
{
int i;
T minv=a[0];
for(i=1 ;i<n ;i++)
{
if(minv>a[i])
minv=a[i];
}
cout<<"调用min1(T a[],int n),最小值为";
return minv;
}
int main()
{
int x=8,y=23;
double a[5]={2.342,11.346,8.93,-18.111,5.930};
cout<<min1(x,y)<<endl;
cout<<min1(a,5)<<endl;
return 0;
}

程序的执行结果如图2-20所示。

图2-20 执行结果

 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.sydw.cn/zhyynl/64161.html