博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C/CPP-函数重载

Posted on 2023-03-13 06:04  乔55  阅读(19)  评论(0编辑  收藏  举报

函数重载基本概念

// 什么叫函数重载
1. 同一作用域下,函数名相同,返回值类型相同,参数列表不同
2. 参数列表不同:参数的类型、个数、顺序不同。
    void show(int a, long b)  // 参数顺序不同的例子
    {
        cout << "1" << endl;
    }
    void show(long a,int b)
    {
        cout << "2" << endl;

    }
    void test()
    {
        long x = 1;
        int a = 2;
        show(a, x);
        show(x, a);
    }


// 函数重载的本质 
- 本质上是2个独立的函数,主要靠函数名和形参列表区分开来
- 


// 函数重载的内部实现
1. 用vcifld分别实现:void,char,int,float,long,double形参类型
2. void xxx(int a, char b, double d);  // 底层函数名就是xxx_icd
3. 查看Linux中函数重载时发生的函数名字改编:
  1. g++ test.cpp
  2. nm test.o




// 函数重载与函数指针
- void(*FP)(int,int);    // 定义函数指针
- FP=fun(10,20);         // 正确
- FP=fun(10,20,1);       // 调用错误




// 函数重载需要注意事项
- 若重载时加了默认参数,调用函数时可能导致二义性
- 函数名相同,返回值类型不同,不构成重载,编译错误
- C语言不支持函数重载




// 编译器调用重载函数的准则
- 将所有同名函数作为候选者
- 尝试寻找可靠的候选函数(3个条件同时进行)
  - 精确匹配实参
  - 通过默认参数匹配
  - 通过默认参数类型转换匹配实参
- 匹配失败时
  - 最终寻找到可行的候选函数不唯一,则出现二义性,编译失败
  - 无法匹配所有的候选者,即函数未定义,编译失败
- 当使用重载函数名给函数指针赋值时
  - 根据重载规则,挑选与函数名指针参数一致的候选者
  - 严格匹配候选者形参类型与函数指针的函数形参类型
`