zoukankan      html  css  js  c++  java
  • 第8课 函数重载分析(上)

    1.  函数的重载(Overload)的概念

    (1)用同一个函数名定义不同的函数

    (2)当函数名不同的参数搭配时,函数的含义不同。

    【编程实验】函数重载初探

    #include <stdio.h>
    #include <string.h>
    
    int func(int x)
    {
        return x;
    }
    
    int func(int a, int b)
    {
        return a + b;
    }
    
    int func(const char* s)
    {
        return strlen(s);
    }
    
    int main()
    {
        printf("%d
    ", func(3));              //int (int)
        printf("%d
    ", func(4,5));            //int (int,int)
        printf("%d
    ", func("Hello World!")); //int (const char* s)
    
        return 0;   
    }

    2. 函数重载

    (1)重载的条件:必须至少满足下面的一个条件

      ①参数个数不同

      ②参数类型不同

      ③参数顺序不同

    (2)函数重载的注意事项

      ①重载函数在本质上相互独立的不同函数

      ②重载函数的函数类型不同

      ③函数的返回值不能作为函数重载的依据

    ④函数重载是由函数名参数列表共同决定的。

    【编程实验】函数重载的本质

    #include <stdio.h>
    
    int add(int a, int b)  //函数类型:int(int,int)
    {
        return a + b;
    }
    
    int add(int a, int b, int c)  //函数类型:int(int, int, int)
    {
        return a + b + c;
    }
    
    int main()
    {
        //printf("%p
    ", add);//因为函数的重载,在编译的结果中找不到这样的函数名
    
        //以下两个printf显示出来,重载函数的本质是相互独立的两个函数,其函数地址
        //是不同的。
    
        printf("%p
    ",(int (*)(int, int))add);    //在add前面加上类型,编译器就会
                                                  //就根据重载函数的命名规则找到
                                                  //被编译后的真正的函数名
    
        printf("%p
    ",(int (*)(int, int,int))add);//在add前面加上类型,编译器就会
                                                  //就根据重载函数的命名规则找到
                                                  //被编译后的真正的函数名
        return 0;   
    }

    3. 函数重载与函数的默认参数

    (1)编译器调用重载函数的准则

      ①将所有同名函数作为候选者

      ②尝试寻找可行的候选函数(注意,下面3种匹配任一种后,会继续匹配下一种,所以可能出现多个匹配的结果!)

        A.精确匹配实参;B通过默认参数能够匹配实参;C通过默认类型转换匹配实参

      ③匹配失败

        A.最终寻找到的候选函数不唯一,则出现二义性,编译失败。

        B.无法匹配所有候选者,函数未定义,编译失败

    【编程实验】函数默认参数 VS 函数重载

    #include <stdio.h>
    
    int func(int a, int b, int c = 0)
    {
        return a * b * c;
    }
    
    int func(int a, int b)
    {
        return a + b;
    }
    
    int main()
    {
        //根据匹配原则:通过函数名找到两个候选函数
        //并尝试先通过精确匹配会找到func(int,int)
        //但这时并不会停止匹配,而是会尝试用默认参数去匹配
        //所以会找到另一个func,即func(int,int,int = 0),因此
        //出现了二义性,编译器直接报错。
        int c = func(1, 2);
    
        return 0;   
    }

    4. 小结

    (1)函数重载是C++中引入的概念

    (2)函数重载用于模拟自然语言中的词汇搭配

    (3)函数重载使得C++具有更丰富的语义表达能力

    (4)函数重载的本质为相互独立的不同函数

    (5)C++中通过函数名函数参数确定函数调用

  • 相关阅读:
    Interesting Finds: 2008.09.15~2008.09.21
    Interesting Finds: 2008.10.05~2008.10.07
    Interesting Find: 2008.10.02
    Interesting Finds: 2008.10.13~2008.10.15
    Interesting Finds: 2008.09.29
    Interesting Finds: 2008.10.08~2008.10.09
    Interesting Finds: 2008.09.22~2008.09.27
    Interesting Finds: 2008.10.12
    Interesting Finds: 2008.10.16~2008.10.18
    9月27号
  • 原文地址:https://www.cnblogs.com/5iedu/p/5372528.html
Copyright © 2011-2022 走看看