函数重载和函数模板
来源:互联网 发布:淘宝成功案例 编辑:程序博客网 时间:2024/05/07 03:22
函数的重载
在编程时,有时我们要实现的是同一类的功能,只是有些细节不同。例如希望从3个数中找出其中的最大者,而每次求最大数时数据的类型不同,可能是3个整数、3个双精度数或3个长整数。程序设计者往往会分别设计出3个不同名的函数,其函数原型为:
int max1(int a,int b, int c); //求3个整数中的最大者double max2(double a,double b,double c); //求3个双精度数中最大者long max3(long a,long b,long c); //求3个长整数中的最大者
C++允许用同一函数名定义多个函数,这些函数的参数个数和参数类型不同。这就是函数的重载(function overloading)。即对一个函数名重新赋予它新的含义,使一个函数名可以多用。
对上面求最大数的问题可以编写如下的C++程序。
例4.5 求3个数中最大的数(分别考虑整数、双精度数、长整数的情况)。#include <iostream>using namespace std;int main( ){ int max(int a,intb,int c); //函数声明 double max(doublea,double b,double c); //函数声明 long max(long a,longb,long c); //函数声明 int i1,i2,i3,i; cin>>i1>>i2>>i3; //输入3个整数 i=max(i1,i2,i3); //求3个整数中的最大者 cout<<″i_max=″<<i<<endl; doubled1,d2,d3,d; cin>>d1>>d2>>d3; //输入3个双精度数 d=max(d1,d2,d3); //求3个双精度数中的最大者 cout<<″d_max=″<<d<<endl; long g1,g2,g3,g;cin>>g1>>g2>>g3; //输入3个长整数 g=max(g1,g2,g3); //求3个长整数中的最大者 cout<<″g_max=″<<g<<endl;} int max(int a,int b,int c) //定义求3个整数中的最大者的函数{ if(b>a) a=b; if(c>a) a=c; return a;} double max(double a,double b,double c) //定义求3个双精度数中的最大者的函数{ if(b>a) a=b; if(c>a) a=c; return a;} long max(long a,long b,long c) //定义求3个长整数中的最大者的函数{ if(b>a) a=b; if(c>a) a=c; return a;}
运行情况如下:185 -76 567↙ (输入3个整数)56.87 90.23 -3214.78↙ (输入3个实数)67854 -912456 673456↙ (输入3个长整数)i_max=567 (输出3个整数的最大值)d_max=90.23 (输出3个双精度数的最大值)g_max=673456 (输出3个长整数的最大值)
上例3个max函数的函数体是相同的,其实重载函数并不要求函数体相同。重载函数除了允许参数类型不同以外,还允许参数的个数不同。
例4.6 编写一个程序,用来求两个整数或3个整数中的最大数。如果输入两个整数,程序就输出这两个整数中的最大数,如果输入3个整数,程序就输出这3个整数中的最大数。#include <iostream>using namespace std;int main( ){ int max(int a,int b,intc); //函数声明 int max(int a,intb); //函数声明 int a=8,b=-12,c=27; cout<<″max(a,b,c)=″<<max(a,b,c)<<endl; //输出3个整数中的最大者 cout<<″max(a,b)=″<<max(a,b)<<endl; //输出两个整数中的最大者} int max(int a,int b,int c) //此max函数的作用是求3个整数中的最大者{ if(b>a) a=b; if(c>a) a=c; return a;} int max(int a,int b) //此max函数的作用是求两个整数中的最大者{ if(a>b) return a; else return b;}运行情况如下:max(a,b,c)=27max(a,b)=8
两次调用max函数的参数个数不同,系统就根据参数的个数找到与之匹配的函数并调用它。
参数的个数和类型可以都不同。但不能只有函数的类型不同而参数的个数和类型相同。例如:
int f(int); //函数返回值为整型long f(int); //函数返回值为长整型void f(int); //函数无返回值
在函数调用时都是同一形式,如“f(10)”。编译系统无法判别应该调用哪一个函数。重载函数的参数个数、参数类型或参数顺序3者中必须至少有一种不同,函数返回值类型可以相同也可以不同。
在使用重载函数时,同名函数的功能应当相同或相近,不要用同一函数名去实现完全不相干的功能,虽然程序也能运行,但可读性不好,使人莫名其妙。
函数模板
C++提供了函数模板(function template)。所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。看下面的例子就清楚了。
例4.7 将例4.6程序改为通过函数模板来实现。#include <iostream>using namespace std;template<typename T> //模板声明,其中T为类型参数T max(T a,T b,T c) //定义一个通用函数,用T作虚拟的类型名{ if(b>a) a=b; if(c>a) a=c; return a;} int main( ){ inti1=185,i2=-76,i3=567,i; doubled1=56.87,d2=90.23,d3=-3214.78,d; longg1=67854,g2=-912456,g3=673456,g; i=max(i1,i2,i3); //调用模板函数,此时T被int取代 d=max(d1,d2,d3); //调用模板函数,此时T被double取代 g=max(g1,g2,g3); //调用模板函数,此时T被long取代 cout<<″i_max=″<<i<<endl; cout<<″f_max=″<<f<<endl; cout<<″g_max=″<<g<<endl; return 0;}
运行结果与例4.5相同。为了节省篇幅,数据不用cin语句输入,而在变量定义时初始化。
程序第3~8行是定义模板。定义函数模板的一般形式为
template < typename T> 或 template <class T>
通用函数定义
在建立函数模板时,只要将例4.5程序中定义的第一个函数首部的int改为T即可。即用虚拟的类型名T代替具体的数据类型。在对程序进行编译时,遇到第13行调用函数max(i1,i2,i3),编译系统会将函数名max与模板max相匹配,将实参的类型取代了函数模板中的虚拟类型T。此时相当于已定义了一个函数:
int max(int a,int b,int c){ if(b>a) a=b; if(c>a) a=c; return a;}
然后调用它。后面两行(14,15行)的情况类似。
类型参数可以不只一个,可以根据需要确定个数。如
template <class T1,typename T2>可以看到,用函数模板比函数重载更方便,程序更简洁。但应注意它只适用于函数的参数个数相同而类型不同,且函数体相同的情况,如果参数的个数不同,则不能用函数模板。
- 函数重载和模板
- 函数重载和函数模板
- C++函数【重载函数和函数模板】
- C++重载和函数模板
- 函数的重载和函数模板
- 浅谈函数重载和模板函数
- c++函数重载和函数模板
- 函数重载和函数模板的区别
- 函数模板 /函数重载
- 函数重载 函数模板
- C++ 模板函数和非模板函数的重载
- [ ]运算符重载和函数模板练习
- 简单的函数重载和模板
- 模板类友元函数和运算符重载
- 模板函数重载
- 函数模板重载
- 模板,函数重载忽略
- 函数重载与模板
- webrtc的音频处理模块apm( audio processing)下载与编译出libwebrtc_audio_preprocessing.so
- LWIP 关于PADDING
- ImageView.ScaleType设置图解
- This Android SDK requires Android Developer Toolkit version 23.0.0 or above.
- Chrome for Mac键盘快捷键!来自Google Chrome官网!
- 函数重载和函数模板
- 最近感想
- Maven+Spring+SpringMVC+MyBatis框架的搭建
- 微信支付开发总结
- MATLAB2014a的安装
- Android 实现变色状态栏
- [JZOJ1088]【SDOI2009】HH去散步
- Angular2挖坑求解系列之一:刷新显示HTTP Error 404.0 - Not Found
- LeetCode笔记:67. Add Binary