03_C++函数重载

03_C++函数重载

1.函数重载概念

同一个事物有不同的作用或者意义,需要结合具体情况来区分。通常这类事物具有相同的作用,只是说在不同的地方可以有不同的解析。比如文言文通假字。比如同样一个男人,不仅仅要忍受生活的痛苦与折磨还有多重角色扮演,老公,父亲,儿子…生活就像一出剧,不同的场景,变不同的脸,更换不同的角色,好与不好都看各位看官;

#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(int argc, char *argv[])
{
    printf("%d\n", func(3));
    printf("%d\n", func(4, 5));
    printf("%d\n", func("C++ OVERLOAD"));
    
    return 0;
}

函数重载三条件,满足其一即可,你又想当爸爸,又想当男朋友,你妈说你要见你女朋友,总的先有个女朋友吧。

  1. 参数个数不同
  2. 参数类型不同
  3. 参数顺序不同
    即使满足以上条件。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);  //即使重载,但是存在二义性。

   return 0;
}

编译器调用函数重载准则。
函数名参数列表共同确认是否是重载函数,和函数返回值无关;

  1. 将所有同名函数作为候选者,其实后台编译时分配了不同函数名的不同功能。
  2. 尝试从候选人中找出最合适的一个,精确匹配||通过默认参数匹配实参||通过默认参数转换匹配实参。
  3. 最终结果要么成功调用,要么失败,编译器报错,为啥?你给的信息有问题,比如一大堆网红中你说那个尖下巴的,斗鱼,熊猫,抖音那么多我怎么知道那个是你要的,那我还不如直接告诉你找不到,你自己再想想哪些信息可以进一步确认呢,这就是二义性,还有一种就是你说“从和尚中找一个那个带刘海的美女”这不是瞎扯么,你找找试试,众里寻他千百度,默然回首,那人从来都没有出现过。

2.函数重载和指针

人类思维模式总是往更改程度的抽象,把一个过程化的东西然后做成一个类型的模型,比如车轮,以后就可以复用了,同样车轮还有不同尺寸,匹配不同的车型就用不同大小,使得整体看起来更加美观,他们一直观念是车高是两个车轮高度最具美感; 把一组函数整合在一起我们可以使用一个指针数组来整合,里面存储的都是函数入口地址,再根据不同index来调用不同的函数,在编译器的识别中函数也是一个地址,这样我们就可以通过指针数组实现一个跳转表。然后再将跳转表结合一个具体实例化,这样就更好实现了封装特性。程序更具有框架性。然后同类的通过overload实现的各个函数,C++只需要通过函数指针调用即可; 但是需要注意函数指针的匹配包括返回值得类型匹配,不仅仅是参数列表

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

typedef int(*PFUNC)(int a);//此处注意int类型的函数指针匹配


int main(int argc, char *argv[])
{
    int c = 0;

    PFUNC p = func;
        
    c = p(1);   
    
    printf("c = %d\n", c); //1

    return 0;
}

函数重载必然发生在同一个作用域中
编译器需要用参数列表和函数类型进行函数选择
无法直接通过函数名得到重载函数的入口地址,需要结合参数和类型共同决定。

猜你喜欢

转载自blog.csdn.net/weixin_43877838/article/details/84697331