从C语言出发新角度内核剖析C++函数重载(千字精品,附带大厂面试问题回答)
目录
C角度引入:
函数重载:
1. 什么是函数重载:
2.函数重载的优点:
3.函数重载的特性:
剖析函数重载:
最后做一个小补充(大厂面试题):
C角度引入:
首先在进行C++讲解之前我们照例先来谈谈C语言是如何做的?
在C语言中是没有函数重载存在的,每一个函数名对应的函数只允许有一种具体的实现,这就可能会导致某些功能极其相似的函数存在命名重复的问题,给程序员增加起名字,记名字的负担。
既然有上述如此明显的弊端,为什么C语言不支持函数重载呢?
答案是C语言是一门极致追求效率的语言,支持函数重载需要编译器对函数名称执行名称修改以包含有关参数类型的信息。但其实这一点点时间的耗损是可以忽略不计的,也因此在C++中正式引入了函数重载。
函数重载:
1. 什么是函数重载:
在同一个作用域中,如果有多个函数的名字相同,但是形参列表不同(参数类型不同或参数个数不同),返回值类型可同也可不同,我们称之为函数重载。
最简单的对于int add(int,int) int add(float,float)就是两个因参数不同而函数重载最典型的例子。
2.函数重载的优点:
- 函数重载的主要优点是它提高了代码的可读性并允许代码重用。
- 使用函数重载是为了节省内存空间、一致性和可读性。
- 它加快了程序的执行速度
- 代码维护也变得容易。
- 函数重载为代码带来了灵活性。
- 该函数可以执行不同的操作,因此无需为同一种操作使用不同的函数名称。
3.函数重载的特性:
1.仅返回值不同的函数不能发生函数重载
2.带缺省参数的部分函数不能发生函数重载(仅在函数调用时会发生二义性情况下)
剖析函数重载:
简单介绍完函数重载的概念,优点及特性后,才正式进入到今天这篇博客的核心。
函数重载是如何实现的?为什么C语言底层不支持函数重载?
在回答这个问题之前,我们首先需要对符号表有一个大致的了解。
在计算机科学中,符号表是一种用于语言翻译器(例如编译器和解释器)中的数据结构 。 在符号表中, 程序源代码中的每个标识符都和它的声明或使用信息绑定在一起 ,比如其数据类型、作用域以及内存地址。
目标文件中通常会有一个包含了所有外部可见标识符的符号表,在链接不同的目标文件时,链接器会使用这些文件中的符号表来解析所有未解析的符号引用。
形象化的来说,实际项目通常是由多个头文件和多个源文件构成,我们可以知道,【当前a.cpp中调用了b.cpp中定义的Add函数时】,编译后链接前,a.o的目标文件中没有Add的函数地址,因为Add是在b.cpp中定义的,所以Add的地址在b.o中。那么怎么办呢?
所以链接阶段就是专门处理这种问题,链接器看到a.o调用Add,但是没有Add的地址,就会到b.o的符号表中找Add的地址,然后链接到一起。那么链接时,面对Add函数,链接器会使用哪个名字去找呢?这里每个编译器都有自己的函数名修饰规则。由于Windows下vs的修饰规则过于复杂,而Linux下g++的修饰规则简单易懂,下面我们将使用g++演示了这个修饰后的名字。
言归正传, 那么为什么会发生函数重载的答案也就显而易见。
答案是在符号表中记录的不同。
那么究竟是如何记录的呢?
gcc 的函数修饰后名字不变,而 g++ 的函数修饰后变成[ _Z+ 函数长度 + 函数名 + 类型首字母 ]采用C语言编译器编译的结果:
采用C++编译器编译的结果:
因此我们发现:
在linux下,采用gcc编译完成后,函数名字的修饰没有发生改变。
在 linux 下,采用 g++ 编译完成后,函数名字的修饰发生改变,编译器将函数参 数类型信息添加到修改后的名字中。通过这里我们就可以理解 C 语言为什么不支持重载,因为同名函数没办法区分;而 C++ 是通过函数修 饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。
最后做一个小补充(大厂面试题):
我们既然说因为函数名修饰不同而导致重载的发生,如果在g++在修饰规则中加入对返回类型的修饰,是不是可以因返回值类型发生重载呢?
答案是不可以!! !因为仍旧会发生匹配重复,你在调用的时候编译器是不知道你需要调用哪一个函数,尽管这些函数名并不相同。形象化的来说,现在你需要你同学的一本书,有两个不同的同学,一个高,一个矮,同时叫小明,高个字拥有书的名称为《超等数学》,矮个子为《高等数学》。如果说需要小明的书?这就是C语言中的不支持函数重载。如果说需要名称为小明且高个子的书?这就是C++中的函数重载。但如果说需要小明的《超等数学》?这就无法发生重载,尽管两个小明并不相同,但你不会知道哪个小明有这本书,不知道该向谁去借。
从C语言出发新角度内核剖析C++函数重载(千字精品,附带大厂面试问题回答)相关推荐
- 首席新媒体黎想教程:3千字抖音运营攻略!
日活4亿的抖音,巨大的流量池,吸引了各行各业的玩家竞相入局.抖音上的运营玩法也多达几十种. 但是90%的人都只知其一不知其二,对抖音里面的各种概念.规则.变现模式不清不楚,盲目入局只会跌得更惨. 很多 ...
- c语言中 允许函数重载么,简述C++语言支持函数重载问题介绍
对于C++语言作为一种欲与C兼容的语言,C++语言保留了一部分过程式语言和特点,foo_int_int这样的名字包含了函数名.函数参数数量及类型信息,C++语言就是靠这种机制来实现函数重载的. 因而它 ...
- ActionScript语言函数重载
更新:你见过JavaScript支持重载吗,规范就是这么定义的.如果不是研究Java和Flex对象的Serialization,我也不会注意它. 距离写这篇文章已有8年了,时光匆匆啊,今天整理资料时看 ...
- Android内核剖析
-- Android内核剖析 柯元旦 编著 ISBN 978-7-121-14398-4 2011年9月出版 定价:79.90元 16开 616页 内容简介: 本书内容分别从基础.内核.系统.编 ...
- Linux0.11内核剖析--内核体系结构
一个完整可用的操作系统主要由 4 部分组成:硬件.操作系统内核.操作系统服务和用户应用程序,如下图所示: 用户应用程序是指那些字处理程序. Internet 浏览器程序或用户自行编制的各种应用程序: ...
- 索骥馆-编程语言之《Android内核剖析》扫描版[PDF]
内容介绍: <android内核剖析>详细分析了android内核的内部机制,包括窗口管理系统.activity管理系统.输入法框架.编译系统等,为android内核定制及高级应用程序开发 ...
- Redis新特性、剖析线程模型(单线程与多线程)
一. Redis6.0 新特性 1. 多线程IO redis6.0引入多线程IO,只是用来处理网络数据的读写和协议的解析,而执行命令依旧是单线程,所以不需要去考虑set/get.事务.lua等的并发问 ...
- 查询优化器内核剖析第一篇
查询优化器内核剖析第一篇 查询优化器内核剖析第一篇 查询优化器内核剖析第二篇:产生候选执行计划&执行计划成本估算 查询优化器内核剖析第三篇:查询的执行与计划的缓存 & Hint提示 查 ...
- 《Linux内核剖析》(Yanlz+VR云游戏+Unity+SteamVR+云技术+5G+AI+Makefile+块设备驱动+字符设备驱动+数学协处理器+文件系统+内存管理+GDB+立钻哥哥+==)
<Linux内核剖析> <Linux内核剖析> 版本 作者 参与者 完成日期 备注 YanlzLinux_Kernel0.12_V01_1.0 严立钻 2020.02.06 # ...
最新文章
- hadoop/hive/hbase 简单区别及应用场景
- cts测试linux指令skip,linux – dd命令中seek和skip之间有什么区别?
- Q79:怎么用三角形网格(Triangle Mesh)细分曲面
- GC overhead limit exceeded
- 病毒+蠕虫+bot+rootkit
- MBTI职业性格在软件研发组织中不同岗位的分布研究
- atoi atol实现
- 网上传的京东撸货为什么那么火?
- 安卓获取手机视频和图片
- 浓淡相宜间,是灵魂的默契;
- php在线备忘录,PHP设计模式 - 备忘录模式
- Win7超级终端查看单片机printf输出
- CLRS 9.1最小值和最大值
- 21世纪的你,还有小农思想吗?你真的拥有现代化的思维!
- aria2 php,aria2是什么东西
- ESP8266 arduino 一键配网之后掉电不丢失wifi数据
- 三勾手机点餐收银系统源码,系统功能完善、页面美观,开源分享
- go课堂笔记20210913
- TopView(赢富)数据图片怎么看
- java 获取图片的媒体属性,以大疆无人机照片为例