8_函数重载分析(上)

关键词: 重载、 函数重载、 函数重载的本质

1. 重载的概念

  • 重载(overload)

    • 同一个标识符在不同的上下文有不同的意义
  • 函数重载(Function Overload)

    • 用同一个函数名定义不同的函数
    • 当函数名和不同的参数搭配时,函数的含义不同
int func(int x)
{
    return x;
}

int func(int a, int b)
{
    return a + b;
}

int func(const char* s)
{
    return strlen(s);
}
  • 函数重载至少满足下面的一个条件:
    • 参数个数不同
    • 参数类型不同
    • 参数顺序不同

2. C++中的函数重载

  • 函数默认参数遇上函数重载会发生什么?
#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(int argc, char* argv[])
{
    int c = func(1, 2);  // which one?

    return 0;
}

输出结果:

test.c: In function ‘int main(int, char**)’:
test.c:16:19: error: call of overloaded ‘func(int, int)’ is ambiguous
  int c = func(1, 2);
                   ^
test.c:16:19: note: candidates are:
test.c:3:5: note: int func(int, int, int)
 int func(int a, int b, int c = 0)
     ^
test.c:8:5: note: int func(int, int)
 int func(int a, int b)

总结:特性之间的冲突,在今后的编程中需要注意这样的特性冲突。

  • 编译器调用重载函数的准则
    • 将所有同名函数作为候选者
    • 尝试寻找可行的候选函数
      • 精确匹配实参
      • 通过默认参数能够匹配实参
      • 通过默认类型转换匹配实参
    • 匹配失败
      • 最终寻找到的候选函数不唯一,则出现二义性,编译失败。
      • 无法匹配所有的候选者,函数未定义,编译失败。

3. C++中的函数重载

  • 重载函数本质上是相互独立的不同函数
  • 重载函数的函数类型不同
  • 函数重载是由函数名参数列表决定的,与返回值没有关系,即函数返回值不能作为函数重载的依据
    编程说明:函数重载的本质
#include <stdio.h>

#define LOG_INT(i) printf("%s = %d\n", #i, i);
#define LOG_POINTER(p) printf("%s = %p\n", #p, p);

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()
{
    LOG_INT(add(1, 2));
    LOG_POINTER((int(*)(int, int))add);

    LOG_INT(add(1, 2, 3));
    LOG_POINTER((int(*)(int, int, int))add);

    return 0;
}

输出结果:

add(1, 2) = 3
(int(*)(int, int))add = 0x804841d
add(1, 2, 3) = 6
(int(*)(int, int, int))add = 0x804842a

4. 小结

  • 函数重载是C++中引入的概念
  • 函数重载用于模拟自然语言中的词汇搭配
  • 函数重载使得C++具有更丰富的语义表达能力
  • 函数重载的本质为相互独立的不同函数
  • C++中通过函数名函数参数确定函数调用

声明:此文章仅是本人在学习狄泰学院《C++深度解析教程》所做的笔记,文章中包含狄泰软件资料内容,一切版权归狄泰软件所有!
实验环境:gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容