zoukankan      html  css  js  c++  java
  • 函数重载与函数模板

    一、函数重载

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

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

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

  • 相关阅读:
    网络优化改进
    图像识别和卷积神经网路案例的实现
    卷积神经网络和图像识别
    ANA网络分析
    大数阶乘
    HDU 1002 A + B Problem II (大数加法)
    HDU 1232 畅通工程 (并查集)
    HDU 1231 最大连续子序列 (dp)
    HDU 2546 饭卡 (dp)
    HDU 1203 I NEED A OFFER! (dp)
  • 原文地址:https://www.cnblogs.com/yagzh2000/p/2160540.html
Copyright © 2011-2022 走看看