2-4:C++快速入门之函数重载
Posted 快乐江湖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2-4:C++快速入门之函数重载相关的知识,希望对你有一定的参考价值。
C++函数重载简单点说就是函数重名问题。还记得我们在学习C语言时必然会做的一个练习——写一个计算器,其中,加减乘除需要使用到不同的函数(当然可以使用回调函数解决),函数名不能相同,但是在C++中就不一样了。
(1)函数重载的概念
C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数形参列表必须不同(个数不同或类型不同或顺序不同),它常用于处理功能类似,但数据类型不同的问题。
int Add(int left,int right)
{
return left+right;
}
double Add(doube left,double right)
{
return left+right;
}
(2)名字修饰
为什么C++支持函数重载,C语言则不支持?
A:C/C++编译运行过程
C/C++程序的生成需要经历预处理,编译,汇编,链接这四个步骤,本人在Linux文章中,详细用Linux展示了这一具体过程,如需了解请移步
在这个四个步骤中,链接操作显得额外重要,因为实际项目是由多个头文件和源文件组成的,如果test.cpp
中调用了sum.cpp
中的add
函数,在链接前,test.o
中是没有add
函数的地址的,因为它是在sum.cpp
中定义的,其地址在sum.o
中。所以在链接时,链接器看到test.o
调用了add
函数,但是里面没有它的地址,而在声明中已经告诉了编译器是有这样一个add
函数的,所以它就会到sum.o
的符号表中找到add函数的地址,然后将其连接在一起
B:C/C++找寻函数时的区别
接上文,它要去链接就必须去找这个函数。
使用下面的文件,分别使用gcc
和g++
进行编译,再用objdump -S
进行反汇编,观察
1.gcc编译C语言
可以发现:Linux下采用gcc编译后,函数名字仍旧是之前的那个,未进行任何修饰
2.gcc编译C++
可以发现:Linux下采用g++编译后,函数名字的修饰发生改变,编译器按函数参数类型的信息添加到函数名字之后
(3)总结
- C语言无法支持重载,是因为同名函数无法区分,C++支持重载,是通过函数修饰规则进行区分,只要参数不同,修饰出来的名字就不同。所以函数重载要求参数不同,与返回值无关。
- 有关C/C++函数名字的修饰规则请移步
- C++对函数是进行了修饰的,所以当其编译好成为动态库后,对于C项目来说就不能使用了,所以为了能照顾C项目,想把某些函数按照C的风格进行编译,也就是不进行修饰,那么就加入
extern "C"
。
extern "C" int Add(int x,int y);
int main()
{
Add(1,2);
return 0;
}
以上是关于2-4:C++快速入门之函数重载的主要内容,如果未能解决你的问题,请参考以下文章