函数重载与函数模板

自闭症网瘾萝莉.ら 提交于 2020-02-17 22:43:43

一、函数重载

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

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

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!