武汉c培训
达内武汉中心

15271940953

热门课程

武汉C++培训:C++函数模板

  • 时间:2016-05-12
  • 发布:武汉C++培训
  • 来源:c语言教程

在《C++函数重载》一节中,为了求三个数的最大值,我们通过函数重载定义了三个名字相同、参数列表不同的函数,如下所示:
  1. //求三个整数的最大值
  2. intmax(inta,intb,intc){
  3. if(b>a)a=b;
  4. if(c>a)a=c;
  5. returna;
  6. }

  7. //求三个浮点数的最大值
  8. doublemax(doublea,doubleb,doublec){
  9. if(b>a)a=b;
  10. if(c>a)a=c;
  11. returna;
  12. }

  13. //求三个长整型数的最大值
  14. longmax(longa,longb,longc){
  15. if(b>a)a=b;
  16. if(c>a)a=c;
  17. returna;
  18. }
这些函数虽然在调用时方便了一些,但从本质上说还是定义了三个功能相同、函数体相同的函数,仍然不够节省代码。能不能把它们压缩成一个呢?

能!可以借助本节讲的函数模板。

我们知道,数据或数值可以通过函数参数传递,在函数定义时它们是未知的,只有在发生函数调用时才能确定其值。这就是数据的参数化。

其实,数据类型也可以通过参数来传递,在函数定义时可以不指明具体的数据类型,当发生函数调用时,编译器可以根据传入的参数自动确定数据类型。这就是数据类型参数化。

所谓函数模板,实际上是建立一个通用函数,其返回值类型和形参类型不具体指定,用一个虚拟的类型来代替(实际上是用一个标识符来占位)。这个通用函数就称为函数模板(Function Template)。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会用实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。

定义模板函数的语法为:

template <typename 数据类型参数 , typename 数据类型参数 , ...> 返回值类型 函数名(形参列表){
    //TODO:
    //在函数体中可以使用数据类型参数
}

其中,template 是定义模板函数的关键字,template后面的尖括号不能省略;typename 是声明数据类型参数名的关键字,多个数据类型参数以逗号分隔。例如,求两个数的值:
  1. //在返回值类型、形参列表、函数体中都可以使用T
  2. template<typenameT>Tsum(Ta,Tb){
  3. Ttemp=a+b;
  4. returntemp;
  5. }
template<typename T>为模板头,T为类型参数。模板函数的调用形式和普通函数一样:
  1. intn=sum(10,20);
  2. floatm=sum(12.6,23.9);
编译器可以根据调用时传递的参数来自动推演数据类型。

改进本节开头的代码,通过函数模板来求三个数的最大值。
  1. #include<iostream>
  2. usingnamespacestd;

  3. template<typenameT>//模板头,这里不能有分号
  4. Tmax(Ta,Tb,Tc){//函数头
  5. if(b>a)a=b;
  6. if(c>a)a=c;
  7. returna;
  8. }

  9. intmain(){
  10. //求三个整数的最大值
  11. inti1,i2,i3,i_max;
  12. cin>>i1>>i2>>i3;
  13. i_max=max(i1,i2,i3);
  14. cout<<"i_max="<<i_max<<endl;

  15. //求三个浮点数的最大值
  16. doubled1,d2,d3,d_max;
  17. cin>>d1>>d2>>d3;
  18. d_max=max(d1,d2,d3);
  19. cout<<"d_max="<<d_max<<endl;

  20. //求三个长整型数的最大值
  21. longg1,g2,g3,g_max;
  22. cin>>g1>>g2>>g3;
  23. g_max=max(g1,g2,g3);
  24. cout<<"g_max="<<g_max<<endl;

  25. return0;
  26. }
运行结果:
12  34  100↙
i_max=100
73.234  90.2  878.23↙
d_max=878.23
344  900  1000↙
g_max=1000

模板函数也可以提前声明,不过声明时需要带上模板头,请看下面的例子:
  1. #include<iostream>
  2. usingnamespacestd;

  3. //声明模板函数
  4. template<typenameT>Tsum(Ta,Tb);

  5. intmain(){
  6. cout<<sum(10,40)<<endl;
  7. return0;
  8. }

  9. //定义模板函数
  10. template<typenameT>Tsum(Ta,Tb){
  11. Ttemp=a+b;
  12. returntemp;
  13. }
可以发现,模板头和函数定义(声明)是一个不可分割的整体,可以换行,但是中间不能有分号。
上一篇:武汉C++培训:重载new和delete运算符
下一篇:C++模板类
选择城市和中心
贵州省

广西省

海南省