C++函数的多重魅力:深入了解函数重载

最近天气回暖,正是学习的好时候,同学们加油!喜欢的朋友点个关注吧!蟹蟹!

目录

一、C++多态

1、多态的理解

(1)、编译时多态(静态多态)

(2)、运行时多态(动态多态)

二、函数重载的引出

三、函数重载实现的原理


一、C++多态

1、多态的理解

在C++中,多态性并不仅限于重载函数,它实际上有两种主要形式:编译时多态(静态多态)运行时多态(动态多态)。其中,函数重载是编译时多态的一种形式而另一种形式是虚函数和继承导致的运行时多态

(1)、编译时多态(静态多态)

        ·函数重载:在同一作用域内,允许定义多个名称相同但参数列表不同的函数,编译器根据函数调用的参数类型或个数选择合适的函数。这种多态性是在编译时确定的,因此也称为静态多态。

(2)、运行时多态(动态多态)

        ·虚函数和继承:通过基类指针或引用调用派生类对象的方法时,实际执行的是派生类的方法,而不是基类的方法。这种多态性是在运行时确定的,因此也称为动态多态。

二、函数重载的引出

在我们的现实生活中,我们经常能碰到一些汉字在不同场景下有不同发音的情况,如:“重”这个字,它的发音就有chong和zhong,我们会根据不同的场景需求给它赋不同的发音,比如我们会说“你怎么写了那么多重复的代码呀!”,这里面的读音就是chong

但是在C语言中我们知道,假设我们要实现传入不同的一个参数个数和参数类型,我们只能定义不同函数来实现,如下代码:

void fun(int a){
    printf("a = %d\n",a);
}
void fun2(int a,int b){
    printf("a = %d\tb = %d\n",a,b);
}
void fun3(int a,int b,int c){
    printf("a = %d\tb = %d\tc = %d\n",a,b);
}

 这样就会造成一个代码复用性差,而且因为每个函数名都需不同,所以就容易造成一个函数命名冲突的一个情况,

在C++中,函数重载就可以解决这个问题,如下代码:

void fun(int a){
    printf("a = %d\n",a);
}
void fun(int a,int b){
    printf("a = %d\tb = %d\n",a,b);
}
void fun(int a,int b,int c){
    printf("a = %d\tb = %d\tc = %d\n",a,b);
}

在上述代码中,函数名相同,但是每个函数的参数个数,参数类型,参数顺序不同,这也就是我们的函数重载。当我们给fun函数传入参数时,它会自动匹配相对应的函数去进行调用,也就避免了给每个函数都取别名的情况。

实现函数重载的条件:同一个作用域,参数不同,参数类型不同,参数顺序不同。

但是注意:我们的函数返回值类型不能作为函数重载依据,这个是为什么呢?当编译器能从上下文中确定唯一的函数时,如ret = func(),这个当然是没有问题的。然而,我们在编写程序过程中可以忽略它的返回值,那么这个时候,一个函数为void func(int x),另一个为int func(int x);当我们直接调用func(10),这个时候编译器就不能确定调用哪个函数了,所以在C++中禁止使用返回值作为重载条件。

三、函数重载实现的原理

编译器为了实现函数重载,也是做了一些幕后工作,编译器用不同的参数类型来修饰不同的函数名,比如void fun();编译器可能会将函数名修饰成func,当碰到void func(int x),编译器将函数名修饰为funcint,同理,当编译器碰到void func(int x,char y),编译器就可能将函数名修饰为funcintchar。

void func(){}
void func(int x){}
void func(int x,char y){}

以上三个函数在Linux下生成的编译之后的函数名为:

_Z4funcv //v 代表 void,无参数
_Z4funci //i 代表参数为 int 类型
_Z4funcic //i 代表第一个参数为 int 类型,第二个参数为 char 类型

 

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一土木彡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值