• 第8课 函数重载分析(上)


    重载(Overload):

    C++中的函数重载:

    函数重载示例:

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 int func(int x)
     5 {
     6     return x;
     7 }
     8 
     9 int func(int a, int b)
    10 {
    11     return a + b;
    12 }
    13 
    14 int func(const char* s)
    15 {
    16     return strlen(s);
    17 }
    18 
    19 
    20 int main(int argc, char *argv[])
    21 {
    22     printf("%d
    ", func(3));
    23     printf("%d
    ", func(4, 5));
    24     printf("%d
    ", func("D.T.Software"));
    25     
    26     return 0;
    27 }

    运行结果如下:

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

    上面的两个函数满足参数顺序不同,所以是可以构成重载函数的。

    当函数默认参数遇上函数重载会发生什么?如下:

    用g++编译上述程序,结果如下:

    如果在main函数中不调用这个func函数的话,则编译器不会报错,因为,这两个函数确实构成了重载关系。但是如果在main函数中调用了func,则编译器不知道具体该调用哪一个函数,所以会报错。

    编译器调用重载函数的准则:

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

      尝试寻找可行的候选函数  

        1、精确匹配实参

        2、通过默认参数能够匹配实参

        3、通过默认类型转换匹配实参

      匹配失败

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

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

     函数重载的注意事项:

    重载本质:

     1 #include <stdio.h>
     2 
     3 int add(int a, int b)  // int(int, int)
     4 {
     5     return a + b;
     6 }
     7 
     8 int add(int a, int b, int c) // int(int, int, int)
     9 {
    10     return a + b + c;
    11 }
    12 
    13 int main()
    14 {
    15     printf("%p
    ", (int(*)(int, int))add);
    16     printf("%p
    ", (int(*)(int, int, int))add);
    17 
    18     return 0;
    19 }

    在VS2010上的运行结果如下:

    可见,两个函数的入口地址不同,因此,它们是不同的函数。

    我们查看一下生成的中间文件test.obj,在VS2010自带的命令行工具下,输入dumpbin  /symbols test.obj,输出结果如下:

    我们看到00c和015这两项分别就是两个func函数对应的项,两个函数编译过后的标识符如下:

    这两个标识符是不一样的,C++编译器就是通过这种方式区别重载函数的。

    小结:

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

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

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

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

      C++中通过函数名和函数参数确定函数调用

  • 相关阅读:
    详解用em替换px
    js判断是否为ie浏览器
    nth-child()选择器小结
    HTML5之canvas
    MQTT-SN协议乱翻之消息格式
    MQTT-SN协议乱翻之简要介绍
    MQTT 3.1.1,值得升级的6个新特性
    MQTT 3.1协议非严肃反思录
    MQTT协议笔记之mqtt.io项目HTTP协议支持
    MQTT协议笔记之mqtt.io项目Websocket协议支持
  • 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9521058.html
Copyright © 2020-2023  润新知