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

    1. 重载的概念

    (1)同一个标识符不同的上下文有不同的意义

          

    (2) 重载自然语言中是随处可见的,那么程序设计中是否也有重载呢?

    2. 函数的重载的概念(Function Overload)

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

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

          

        

    【编程实验】函数重载初探  8-1.cpp

    #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;  
    
    }

    运行结果:

      

    3. 函数重载的条件和注意事项

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

      ①参数个数不同

      ②参数类型不同

      ③参数顺序不同

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

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

    ②    重载函数函数类型不同

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

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

     

    【编程实验】函数重载的本质  8-3.cpp

    #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;  
    
    }

    运行结果:

      

    4. 函数重载函数默认参数

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

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

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

      • A.精确匹配实参;

      • B通过默认参数能够匹配实参;

      • C通过默认类型转换匹配实参

      ③匹配失败

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

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

    【编程实验】函数重载  VS 函数默认参数  8-2.cpp

    #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;  
    
    }

    编译报错:

      

    5. 小结

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

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

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

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

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

  • 相关阅读:
    OCP 062【中文】考试题库(cuug内部资料)第19题
    OCP 062【中文】考试题库(cuug内部资料)第18题
    OCP 062【中文】考试题库(cuug内部资料)第17题
    743. 网络延迟时间 力扣(中等) 最短路径SPFA,不熟练
    1337. 矩阵中战斗力最弱的 K 行 力扣(简单) 确实简单,结构体排序,二分也可
    171. Excel 表列序号 力扣(简单) 想不明白的题
    987. 二叉树的垂序遍历 力扣(困难) bfs+hash+优先队列 感觉还是简单的,就是复杂了点
    46. 全排列 力扣(中等) 容器或回溯
    1947. 最大兼容性评分和 周赛 力扣(中等) 排列next_permutation用法
    1104. 二叉树寻路 力扣(中等) 数学题,思考久了
  • 原文地址:https://www.cnblogs.com/hoiday/p/10089068.html
Copyright © 2011-2022 走看看