C++|函数重载

1.说明

C++的函数支持重载,这是C++语法中非常重要的一部分,很多语法功能的实现都与它息息相关,而重载本身也是非常重要的功能。

C++的函数重载简允许在同一个项目内出现相同的两个或多个相同的函数名,这与命名空间无关,虽然命名空间的的实现与重载的实现有非常紧密的联系,但是从语法角度来看两者是有较大的区别

C++中当我们定义函数时可以定义同名函数只要他们满足传参不同的条件(数量/类型/顺序)

void functiuon1(char a,int b)
{
    cont << a << "" << b <<endl;
    return ;
}
//是char和int
void functiuon1(int a,char b)
{
    cont << a << "" << b << endl;
    return ;
}
//是int和char

调用的时候只需要根据对应重载函数的类型输入参数就可以调用对应函数

int main()
{
    function1('1',1);
    //这是在调用第一个
    function1(1,'1');
    //这是在调用第二个
    return 0;
}

抽象吗?让我们来根据底层原理来讲解一下他的实现就很好理解了(各个编译器的修饰规则不同我们以GCC为例)

在C中我们无法定义两个相同函数名的函数,这是因为当我们使用函数时会根据函数的名称来寻找函数,假如有多个定义的话就会出现不知道需要找哪个函数的囧镜,而在C++中函数会根据定义的信息来添加前缀,规则如下:

                1.在函数名前加上 _Z

                2.在_Z后面加上函数名的字符个数

                3.在函数后添加参数缩写

void function1(char a,int b)
//会变成 _Z9function1ci
void function1(int a,char b)
//会变成 _Z9function1ic

如例,在写的时候只要满足传参不同的条件那么就会修饰出两个不同的函数,调用的时候也会根据传过去参数的不同带来不同的修饰来找到不同的参数

命名空间的实际实现其实也是通过名称修饰来实现的,不过两者应该区分开来,他们属于的语法规则不同,作用域引用可能是单纯的加入修饰,而展开和作用域内使用函数却无法如此简单的看待,实现的效果接近但使用对应的规则不同使用也不同。

顺带一提命名空间的修饰规则好像是:

                1.在函数名前加上 _ZN 

                2.在_ZN后面加上函数名的字符个数(包括命名空间的名称)                

                2.在后加上命名空间的名称

                3.在函数后添加参数缩写

2.对C的支持

我们都知道C++的编译器是兼容C语言的,我们使用C++的编译器能跑C语言,并且C++的库函数也能直接开放给C使用,这就有点问题了,由于C++的编译器会在编译时将函数按照C++的规则来修饰,这种内容C是肯定看不懂的,于是为了让C看懂,C++对extren关键字添加了一种新用法

我们可以在定义函数前加上extren "c"来定义C修饰规则的函数,这个函数按照C的规则进行修饰,同时不支持重载,在C++程序来调用"c"函数时会按对应规则来修饰

如果同时存在声明和定义我们需要在声明上添加,而定义不必要,除非你把定义写在调用之前,声明写在调用之后,只要声明或者定义其中之一写了编译器就会按C的修饰规则来编译,但通常认为只要声明写并且推荐声明写,这样假如你不用这个声明就不会这样修饰,这给了选择的余地,我们可以转们写个兼容C的不必兼容C的,不过要注意假如加入了C的修饰规则就应该在调用之前告诉它,不然调用会按C++的规则修饰,由于声明通常写前面,所以在声明写还是必要的

3.缺省参数/默认参数

想必大家都知道缺省参数吧,不知道也没关系,我来小小的讲解一下

在C++中函数参数至此添加默认参数,在使用时可以不填这一部分,在调用时会默认赋值,所以即称之为缺省参数又称之为默认参数,对于缺省参数只能从右往左缺定义默认值,从左往右缺省,这是为了清晰传参顺序,到底缺了那些,能缺那些,而他的实现就是利用重载。

在编译时,他会根据能缺省的个数来重载出不同的函数,然后根据参数来调用,缺省的一种可能性就对应一个重载,所以如果写了缺省的重载对应其他内容重载的可能性,那么会报错,需要注意缺省其实就是重载

你敢信我一个多小时就肝完了一篇博客,爽了,你们可能刚刚要放假,而我要等国庆之后才会开学

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值