概述

在学校里,我们都会有班里同学被起外号的经历,而且同一个人可能还会有好几个外号。

在自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。

目录

概述

什么是函数重载

怎么使用函数重载

函数重载为什么不考虑用返回值进行区分重载?

C++支持函数重载的原理--名字修饰(name Mangling)

为什么C编译器不支持函数重载?


什么是函数重载

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。

怎么使用函数重载

参数类型不同:

int Add(int left, int right)
{
cout << "int Add(int left, int right)" << endl;
return left + right;
}
double Add(double left, double right)
{
cout << "double Add(double left, double right)" << endl;
return left + right;
}

参数个数不同:

void f()
{
cout << "f()" << endl;
}void f(int a)
{
cout << "f(int a)" << endl;
}

参数类型顺序不同:

void f(int a, char b)
{
cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
cout << "f(char b, int a)" << endl;
}

test

int main()
{
Add(10, 20);
Add(10.1, 20.2);
f();
f(10);
f(10, 'a');
f('a', 10);
return 0;
}

函数重载为什么不考虑用返回值进行区分重载?

从重载的机制来看,在调用相同名称的函数时,返回值类型不能作为区分函数的重载判断依据(且函数调用不一定用返回值),但是利用形参列表可以区分.。

C++支持函数重载的原理--名字修饰(name Mangling)

我们知道在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接。

C++函数重载底层原理就是基于编译器的 name mangling 机制。在编译阶段,编译器会为C++中的所有函数,在符号表中生成唯一的标识符(类似起别名),用来区分不同的函数。而对于同名不同参的函数,编译器在进行name mangling操作时,会通过函数名和其参数类型生成唯一标识符,用来支持函数重载。(C语言没有函数取别名)

由于VSstdio的函数名字修饰规则比较复杂,我们来看一下Linux下的函数重载具体生成过程:

在Linux编译之后,我们可以看到函数的名字变了, int Add (int a, int b) 编译后函数名变成了:_Z3Addii    void func(int a, double b, int* p) 编译后函数名变成了: _Z4funcidPi

这里的name mangling 机制是:前缀 _Z是GCC的规定(写gcc编译器人员规定的),数字3 是函数名Add的字符个数,i表示第一个函数的参数类型int,i是第二个函数的参数类型int。对于第二个函数签名中Pi则表示第三个函数类型是int*

我们同时可以发现,函数重载与返回值类型无关,仅与函数名和函数参数类型相关。即如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办法区分。

在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参数类型信息添加到修改后的名字中。

附Windows下名字修饰规则:

对比Linux会发现,windows下vs编译器对函数名字修饰规则相对复杂难懂,但道理都是类似的,我们就不做细致的研究了。

为什么C编译器不支持函数重载?

因为C编译器的name mangling规则与C++的不同:C语言的命名规则仅依赖于函数名,和函数参数类型无关。因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。


本节完

【C++】函数重载的使用及原理相关推荐

  1. 【 C++入门 】函数重载、extern“C“

    目录 一.函数重载 1.函数重载概念 2.函数重载注意点 3.问题:为何C语言不支持函数重载,反倒C++可以? Linux环境下演示函数重载 回顾程序的编译链接 采用C语言编译器编译后结果 gcc的函 ...

  2. c++函数重载机制实现原理

    原文链接:https://blog.csdn.net/gogogo_sky/article/details/72807123 一.c++函数重载的定义: 在同一作用域类,一组函数的函数名相同,参数列表 ...

  3. C++ 函数重载的实现原理

    C++ 函数重载主要原理在于编译器会根据参数的类型和个数不同对函数名字作出修改 例如 void Demo(int a,int b) {std::cout << "test int ...

  4. 美丽的闭包,在js中实现函数重载

    引言 最近在js的学习中,看到了函数重载的问题,一开始,只看到了实现代码,看着代码冥思苦想了半个小时,总算是理清了其实现的原理,也为其实现的巧妙感到赞叹,也是在自己搞懂原理之后,去网络上搜索了下,才知 ...

  5. 【Qt教程】1.7 - Qt5带参数的信号、信号重载、带参数的槽函数、槽函数重载

    原理:与C++语法一致,信号.槽函数都可以发生重载,使其在名称不变的情况下,传递过程可以携带参数. 示例说明:我们从一个最普通的信号槽工程中,来修改,对信号.槽进行重载,使信号.槽携带参数. 1. 普 ...

  6. 详解 C++ 的隐式类型转换与函数重载!

    作者 | 樱雨楼 责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 在上篇中,我们讨论了C++中与隐式类型转换相关的一些话题,而函数重载是与隐式类型转换相关的又一大重要话题,本篇将要讨论的 ...

  7. 从C快速入门C++ (命名空间、引用、函数重载)

    从C快速入门C++ (命名空间.引用.函数重载) C++关键字 const const 的存储位置 结论: 命名空间 C++预处理器 和 iostream 文件 头文件名 命名空间使用 函数重载 默认 ...

  8. 虚函数:多态的实现原理

    一.序言  C++ 中的虚函数的作用主要是实现了多态的机制.关于多态,说白了就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数(当然引用也可以达到该目的,引用也是指针的另一 ...

  9. 【C++】引用、内联函数、函数重载、函数默认参数(缺省参数)与占位参数、extern “C“ 浅析

    端午继续~         C++对C的扩展 目录 引用 普通变量名引用 对数组的引用 对指针的引用 对函数的引用 引用作为函数的参数 引用作为函数的返回类型 常引用 内联函数 函数重载 函数的默认参 ...

最新文章

  1. Myeclipse中项目没有代码错误提示,jsp页面无编译迹象?如何解决
  2. 戳破微服务的七大谎言
  3. 常用的函数式接口_Function接口
  4. 【设计】精致的侧滑菜单设计案例
  5. 【Python基础】11_Python中的字符串
  6. UVA - 1588 ​​​​​​​Kickdown
  7. TensorFlow官方教程翻译:TensorFlow调试器
  8. OCR 脱机手写汉字识别与印刷汉字识别
  9. 单龙芯3A3000-7A1000PMON研究学习-(7)撸起袖子干-make cfg 所执行的操作(d)
  10. spring boot 2 整合 j2Cache
  11. 腾讯云 配置短信验证
  12. 假如现在你有30分钟,你会做什么?
  13. java+poodle漏洞修复_如何修复 POODLE SSLv3 安全漏洞 (CVE-2014-3566)
  14. “暗云”BootKit木马详细技术分析
  15. 巴比特 | 元宇宙每日必读:在NFT领域卖铲子能有多赚钱?云厂商们认为这就像“发电厂”业务...
  16. recon-ng模块安装与基本使用(国内环境)
  17. LIS的O(nlogn)算法(二分)
  18. 西门子1200PLC和KTP700触摸屏控制西门子V90伺服电机例子程序
  19. 【SPSS统计分析】运用spss软件进行问卷信度分析(附SPSS19.0简体中文版下载地址)
  20. 机器学习基础——分类算法之决策树、随机森林、Titanic乘客生存分类

热门文章

  1. 做互联网多年,还不知道什么是软著?软著有什么用?
  2. 区间DP--LeetCode5498石子游戏
  3. 研发人员在公司内部调岗会发生哪些事情?
  4. 报错JDBC Connection [com.mysql.jdbc.JDBC4Connection@184c65da] will not be managed by Spring
  5. 淘宝API app版淘宝商品搜索可选参数
  6. Oracle篇--04 Oracle SQL高级查询、分页查询
  7. 中鑫吉鼎|不同人生阶段的女性理财方式
  8. mysql 时间 本周 本月_日本人脑洞最大的奇葩恋爱游戏,本周上架Steam,别在吃饭时玩...
  9. Beyond compare4 激活和秘钥
  10. 转换视角看问题---“两个世界”