前言
从C语言过渡到C++之后,C++不仅兼容了C语言的绝大多数语法,而且还对C语法有了许多改进,其中有一个亮点就是C++可以支持函数重载。
面对这个新的名词我们可能产生了许许多多的疑惑
函数重载是什么呢?为什么C++支持函数重载而C不支持函数重载?C++是怎样支持函数重载的呢?
下面我的这篇blog就来解决大家这些疑问吧!
一:函数重载
在自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词的真实含义,即该词被重载了。
比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者是“谁也赢不了!”,后者是“谁也赢不了!”
二:函数重载的概念
函数重载: 是函数的一种特殊情况,C++允许在同一个作用域中声明或定义几个功能不同的同名函数。
简而言之:同一个作用域中声明或定义多个功能不同的同名函数。
注意事项: 这些同名函数的形参列表(参数个数、类型、顺序)必须不同,仅返回值不同则不能构成函数重载。
应用场景: 处理功能类似但数据类型不同的问题。
- 举个栗子
int Add(int left, int right){
return left + right;
}
double Add(double left, double right){
return left + right;
}
void Func(int num, char ch){
}
void Func(char ch, int num){
}
int main()
{
Add(10, 20);
Add(10.0, 20.0);
//根据实参类型自动时别类型调用对应函数
Func('a', 10);
Func(10, 'b');
return 0;
}
三:函数名修饰(name Manging)
为什么C++支持函数重载而C语言不支持函数重载?在C/C++中一个程序的运行需要经历以下几个阶段:
- 预处理:
头文件的展开,宏替换,去掉注释,条件编译(生成 .i 文件)
- 编译:
检查语法、生成汇编代码(生成 .s 文件)
- 汇编:
将汇编代码转为二进制机器码(生成 .o 文件)
- 链接:
将源文件中用到的库函数和汇编生成的目标文件和并生成可执行程序(生成 a.out 文件)
实际我们知道,项目通常是由多个头文件和多个源文件构成的,在编译后链接前,汇编生成的 .o 文件中是没有所调用函数的地址的,那么在链接阶段,会在所调用函数的定义文件的符号表中去找函数地址,然后将它们链接到一起,生成可执行程序。
那么在链接时,面对目标函数,链接器会使用哪个名字去找呢?这里每个编译器都有自己的函数名修饰规则,下面我们在Linux下给大家做一下演示:
采用C语言编译器编译后的结果:

采用C++编译器编译后的结果:

到这里我们就能理解C语言不支持函数重载是因为同名函数没法区分,而C++支持函数重载是因为通过函数名修饰规则来区分同名函数,参数不同修饰出来的函数名也就不同。
另外我们也就理解了为什么函数重载要求函数的参数列表不同,而跟返回值没有关系。
小结
我的这篇博客到这里就结束喽,开篇我们提到的问题到现在大家应该有了一个比较清楚的认识,理解了函数重载,以及C和C++对重载问题的区别,这对于我们今后理解后续的知识也有一个坚实的铺垫。
1104

被折叠的 条评论
为什么被折叠?



