什么是函数重载
代码分析
总结
什么是函数重载
函数重载的即是在相同作用域中的多个函数,它们具有相同的名字而型参不同,但是在C++中他们可以正常编译,不会因为同名而出现error。这是因为在C++利用了name mangling(倾扎)技术,在对程序编译之前,编译器将会用参数个数和参数类型对每一个函数标识符进行专门编码。

接下来我们将会使用C++和C中分别实现代码,使用nm命令来查看可执行文件的中编译后的函数名是怎样的?

代码分析
我们借用如下代码分别使用c和c++的编译器编译运行,来进行分析。
`int Add(int a, int b){
return a+b;
}
float Add(float a, float b){
return a+b;
}
int main(){
int c = Add(10, 5);
}
C语言分析:

我们将上述代码放入overload.c的文件中,使用c的编译器进行分析,将会出现报错如下:

这就是因为在我们的程序中有两个同名的函数,也证明了C语言无法实现重载。那么我们修改这段代码,去掉一个Add函数,具体代码如下:
`int Add(int a, int b){ return a+b;}int main(){ int c = Add(10, 5);}
编译通过,生成可执行文件a.out,我们使用nm 可执行文件名查询该可执行文件中编译过的函数名如下:

我们会发现在C的编译器下,编译过的函数名和我们程序中自定义的函数名是相同的。接下来我们使用C++的编译器来进行编译。

C++分析

将不做修改的代码放入一个overload.cpp文件中,使用C++编译器进行编译,会发现这次不会报错,这也是C++中函数重载的结果,我们直接使用nm来查看编译过的函数名。

我们会发现函数名发生了改变,这就是C++的编译器对程序中的函数中的每一个函数名进行了编码,其中的_z是规定前缀,3是函数名的个数,i是参数列表类型int的首字母。这个过程我们称作“名字改编”或“名字修饰”,类型安全的连接使得程序能够调用合适的重载函数并保证了参数传递的一致性。

注意:main函数不会进行名字改编。

更多相关文章

  1. Android(安卓)NDK之二:创建NativeActivity
  2. Android(安卓)4.03 编译系统------lunch
  3. 【Android应用开发】Android(安卓)Studio 简介 (Android(安卓)St
  4. android 单例
  5. Android基础知识总结
  6. android system setup and building (3)
  7. Android自带Music播放器更新播放时间和进度条的方法
  8. Android架构分析之使用自定义硬件抽象层(HAL)模块
  9. 如何解决Eclipse开发android程序的编译错误:com/android/dx/comm

随机推荐

  1. android中Textview如何限制在一行显示且
  2. android Material
  3. 引用 Android的DTMF处理(ToneGenerator)
  4. Android Bundle类(简单实例)
  5. Android上使用Chrome DevTools 远程调试W
  6. Android SystemProperty
  7. Android adb shell 常用命令
  8. Android(安卓)Camera——拍照
  9. Android根据经纬度获取地址
  10. 向Android模拟器发短信打电话