一、函数重载
重载就是函数名相同但实参的类型或数量不同的函数的调用。
注意有两种:实参是类型不同或数量不同。(为什么不说形参,因为会有默认值的存在)
如得到一数组中最大值,因为有int和double基本的类型,一个函数无法表达
int getmax(int intArr[],int len);double getmax(double douArr[],int len);
为什么要同名?
主要是方便记忆。如你输入getmax后,编译器会自动给你提示有这样的函数且会把它的形参类型带出来,便于选择。当然你也可以写成不同的名称: getintmax,getdoublemax.
多个在一程序中的同名函数就是函数重载,以下为得到数组的最大值例子:
#include<iostream>using namespace std;int getmax(int intArr[],int len);double getmax(double douArr[],int len);int main(){ int arr1[]={25,1,86,45,365,55,8}; int len1=sizeof arr1 / sizeof(int); double arr2[]={253.55,12.2,8895.12,4.9}; int len2=sizeof arr2 / sizeof(double); cout<<"Int Array MaxValue is: "<<getmax(arr1,len1) <<endl; cout<<"Double Array MaxValue is:"<<getmax(arr2,len2) <<endl; return 0;}int getmax(int intArr[],int len){ int result=intArr[0]; for(int i=1;i<len;i++) if (result<intArr[i]) result=intArr[i]; return result;}double getmax(double douArr[],int len){ double result=douArr[0]; for(int i=1;i<len;i++) if (result<douArr[i]) result=douArr[i]; return result;}
二、函数模板
在函数重载中,我们会发现执行的功能是一样的,只是类型不同,因此在C++中用到关键字template(模板)。
我们可以用template<class T> T来做个泛定义,这个T就是根据实参的类型来自动替换的,类型中间以逗号分开,因此,我们可以用以下定义的方式定义一个函数模板,
在调用时用实参类型自动替换。
template<class T,class T2..> T getmax(T Arr[],int len);
template<typename T,typename T2> T getmax(T Arr[],int len);
以上就是getmax函数的模板,尖括号中的class和typename不同而已。 class一般为已存在的类型,而自定义的类型一般用typename,
以下为源代码:
#include<iostream>using namespace std;template<typename T> T getmax(T myarr[],int len){ T result=myarr[0]; for(int i=0;i<len;i++) if (result<myarr[i]) result=myarr[i]; return result;};int main(){ int arr1[]={25,1,86,45,365,55,8}; int len1=sizeof arr1 / sizeof(int); double arr2[]={253.55,12.2,8895.12,4.9}; int len2=sizeof arr2 / sizeof(double); cout<<"Int Array MaxValue is: "<<getmax(arr1,len1) <<endl; cout<<"Double Array MaxValue is:"<<getmax(arr2,len2) <<endl; return 0;}
用函数模板时,会增大程序的容量。
程序在编译时会根据实参的类型去查找相应的函数,如果没有找到就会自动找相关的模板函数,把实参类型代入后系统自动生成一个以实参类型相关的函数。当此时还有同样类型的实参调用时,就会用这个已生成的函数否则产生新的函数。
如果函数模板定义后相自己加上一个或多个函数,则可以在函数模板定义的后面加上一句:如 double getmax(double,int);
如下:
template<typename T> T getmax(T myarr[],int len){ T result=myarr[0]; for(int i=0;i<len;i++) if (result<myarr[i]) result=myarr[i]; return result;};double getmax(double,int); //只写类型即可,这样在调用double类型时系统不再自动产生这样的函数
来源:https://www.cnblogs.com/yagzh2000/archive/2011/08/31/2160540.html