C++入门Step15【函数重载与默认参数】

函数的重载与默认参数:

  1. 函数的重载:

    1. 由来:

      在编程中,总会出现许多功能差异很小的函数,但却需要多次定义多个函数:例如,要求2个数中比较大的数,这两个数的类型有时候是int类型,有时候是float类型,很是麻烦,按照之前的写法应该是这样封装函数:

      int max_int(int a, int b);
      float max_float(float a, float b);
      

      这样好吗?这样不好。

      用户在调用的时候就要根据不同的参数类型,调用不同名字的函数,如果要求两个int类型的数中的比较大的就要调用 max_int,如果要求两个float类型的数中的比较大的就要调用 max_float,能不能叫一个名字呢?让系统自己去适配到底调用哪个?当然是可以的。

      int max_num(int a, int b);
      float max_num(float a, float b);
      

      这就是函数的重载。
      C++允许同一函数名定义多个函数,这些函数的参数类型和个数可以不相同,而且至少要有一个不相同,如果都相同的话就会报重复定义的链接错误了。使一个函数名可以多用

    2. 要求与原则:

      要求:

      重载函数的参数个数参数类型参数顺序 三者中必须至少有一种不同(不然会产生调用疑惑)。函数的返回值类型可以相同也可以不同。

      注意:单纯返回值类型不同的两个同名函数不能构成函数重载,会报链接错误。

      int max_num(int a, int b);	
      bool max_num(int a, int b);	
      //以上两个仅函数返回值类型不同,会发生链接错误,编译报错
      float max_num(float a, float b);
      
      

      原则:

      函数的重载一般都是功能相近,或者功能类似的函数进行重载,不能把一些功能相差很大,或者完全不相关的函数叫同一个名字,语法上是没有错误,但是违背函数重载设计的初衷啦。

      practice:

      int max_num(int a, int b) {
          return a>b?a:b;
      }
      
      float max_num(float a, float b)
      {
          return a>b?a:b;
      }
      
      int main()
      {
          cout<< max_num(2, 8)<<endl;
          cout<< max_num(6.6f, 3.6f)<<endl;	
          /*
          在此处需要注意:若不加‘f’,编译器自动默认为double类型,而出现错误,就像这样:
          cout<< max_num(6.6,3.6);	Error:Call to 'max_num' is ambiguous :102(调用'max num'是不明确的)
          */
          return 0;
      }
      

在这里插入图片描述

  1. 函数的默认参数:

    1. 引出:倘若一个函数,有求数组最大值和最小值的功能,但,有时想要最大值,有时想要求最小值,有时两个都要,此时该怎么办呢,需要怎么让这个函数变得灵活起来呢?这时就该用到函数的默认参数了。

      void get_min_max(int src[], int arr_len, int* max_v, int min_v);
      //修改声明如下:
      void get_min_max(int src[], int arr_len, int* max_v = NULL, int min_v);
      
    2. 注意事项:

      ①. 在函数声明的时候指定,如果没有函数的声明则可以放在函数的定义中,但是声明和定义只能选一个;
      ②. 从第一个有默认值的参数开始,后面的所有参数必须都有默认值才行;
      ③. 调用的时候如果要自定义非第一个默认值的参数,那么前面所有的参数都要明确的写上默认值才行;
      ④. 从使用角度来说函数的默认值比重载更方便,从函数内部实现角度来说比函数的重载更复杂。

      栗子实现:

      #include<iostream>
      using namespace std;
      
      void get_min_max(int src[], int arr_len, int* max_v = NULL, int* min_v = NULL)
      {
          if(max_v == NULL&&min_v == NULL)return;
          int max = src[0], min = src[0];
          for(int i = 0;i<arr_len;++i)
          {
              max = max>src[i]?max:src[i];
              max = max>src[i]?max:src[i];
          }
          if(max_v) *max_v = max;
          if(min_v) *min_v = min;
      }
      
      int main()
      {
          int src[] = {2, 5, 9, 10, 6}, max = 0, min = 0;
          int arr_len = sizeof(src)/sizeof(int);
          
          get_min_max(src, arr_len, &max, &min);
          cout<<"max = "<<max<<"\nmin = "<<min<<endl;
          max = 0;min = 0;
          get_min_max(src, arr_len, &max);
          cout<<"max = "<<max<<"\nmin = "<<min<<endl;
          max = 0;min = 0;
          get_min_max(src, arr_len, NULL, &min);
          cout<<"max = "<<max<<"\nmin = "<<min<<endl;
          max = 0;min = 0;
          get_min_max(src, arr_len);
          cout<<"max = "<<max<<"\nmin = "<<min<<endl;
          return 0;
      }
      

在这里插入图片描述

  1. 函数的默认参数对函数重载所造成的歧义:

    //函数默认参数
    
    void get_min_max(int src[], int arr_len, int* max_v = NULL, int* min_v = NULL)
    {
        if(max_v == NULL&&min_v == NULL)return;
        int max = src[0], min = src[0];
        for(int i = 0;i<arr_len;++i)
        {
            max = max>src[i]?max:src[i];
            max = max>src[i]?max:src[i];
        }
        if(max_v)*max_v = max;
        if(min_v)*min_v = min;
    }
    
    //函数默认参数与函数重载造成的歧义
    int get_min_max(int src[], int arr_len)
    {
        int var_max = src[0];
        for (int i = 1; i < arr_len; ++i)
        {
            if (var_max < src[i]) var_max = src[i];
        }
    
        return var_max;
    
    }
    
    void max_min()
    {
        int src[] = {2, 5, 9, 10, 6}, max, min;
        int arr_len = sizeof(src) / sizeof(int);
        get_min_max(src, arr_len);	//Error:Call to 'get_min_max' is ambiguous
        get_min_max(src, arr_len, &max);
        get_min_max(src, arr_len, &max, &min);
    }
    
    

在这里插入图片描述

部分解释性话术引自VC驿站:https://www.cctry.com/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值