函数重载与函数模板
一、函数重载
重载就是函数名相同但实参的类型或数量不同的函数的调用。
注意有两种:实参是类型不同或数量不同。(为什么不说形参,因为会有默认值的存在)
如得到一数组中最大值,因为有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类型时系统不再自动产生这样的函数