函数重载与函数模板

一、函数重载

重载就是函数名相同但实参的类型或数量不同的函数的调用。

注意有两种:实参是类型不同或数量不同。(为什么不说形参,因为会有默认值的存在)

如得到一数组中最大值,因为有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类型时系统不再自动产生这样的函数

posted on 2011-08-31 11:44  天上星  阅读(3258)  评论(0编辑  收藏  举报

导航