当前位置: 首页 > article >正文

C++入门——函数重载

C++入门——函数重载

一、什么是函数重载?

  • 自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。
  • 函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数类型类型顺序)不同,常用来处理实现功能类似但数据类型不同的问题。

1.参数个数不同型

如图所示:
示例1
在这里,我们定义了两个函数,它们的函数名相同,都为Add,从字面上也能知道它们的功能。但是二者的区别在于参数个数不同,第一个是完成的是两个整型的加法,第二个则是三个整型的加法,因此,在调用两个函数时,传参个数也不同。

2.参数类型不同

如图所示:
示例2
这里是参数的类型不同,一个是int型,另一个是double型。

3.参数类型的顺序不同

如图所示:
示例3
这里并不是参数名称顺序不同,而是参数的数据类型的顺序不同,比如这里就是先int后double还是先double后int。

注意事项

  • 仅有返回值的类型不同并不能构成函数重载
    如图所示:
    示例4
    示例5
    示例6
  • 函数重载针对的是同名函数的形参列表,根据函数调用时的传参来匹配调用哪一个函数,与函数里面具体的定义没有关系,如图所示:
    示例7
    在这里,同样是func函数,一个是实现两个数字相加,一个是实现三个数字相乘,它们的定义不同,但是由于传参个数的差异能够在调用的时候区分开来,构成重载。
  • 让我们来看这样一段代码:
    示例8
    示例9
    示例10
    明确地讲,这里确实构成了函数重载,但由于这里使用的缺省参数,导致在不传参的情况下,调用这两个函数都可以,正如报错里所说,调用不明确。

我们知道,C语言是不支持函数重载的,C++能够支持。那么,为什么C++能够支持函数重载呢?让我们接着往下看,一探究竟!

二、函数重载的深入理解

1.编译链接过程详解

(1)预处理——生成.i文件
  • 头文件展开、去掉注释、宏替换、条件编译……
  • 我们用Linux操作系统来演示一下:
    示例11
    首先,写上一段C语言代码:
    示例12
    然后,输入指令,生成预处理后的文件test1.i如图:
    示例13
    示例14
    这个文件很长,有800多行,因为展开了头文件<stdio.h>,最后才是刚刚的代码。
(2)编译——生成.s文件
  • 检查语法,生成汇编代码。
  • 同样,我们用Linux来演示一下:
    输入指令,生成编译后的文件test1.s,如图所示:
    示例15
    这是汇编语言。
(3)汇编——生成.o文件
  • 将汇编代码转化为机器可以识别的二进制码。
    直接用vim看是看不出来的,是一堆乱码:
    示例16
  • 我们可以用一些查看工具:xxd
    示例17
(4)链接
  • 生成可执行文件——.exe(Windows)或者a.out(Linux)

2.C++是怎么支持函数重载的?

  • 调试代码,右击转入反汇编:
    示例18
    示例19
    示例20
    在上图中,调用函数需要call(StackPush)函数的地址,而这两个函数的地址是不同的,那么,在函数名相同的情况下,C++是怎么区分重载函数的呢?
  • 我们还是使用Linux写一段代码:
    示例21
    这里func函数是重载函数,它们的参数个数不同。我们来看一下具体的内容:
    示例21
    这里就是两个重载的func函数Z4funci和Z4funcid,4表示的是函数名的长度,i表示的是参数为int,d表示参数为double型,这是就C++的函数名修饰规则,将重载函数区分。
    因为C++具有的函数名修饰规则,函数重载得以实现。

三、本期总结+下期预告

本期内容为大家详细介绍了C++中的函数重载,下期内容将为大家带来引用的内容!

感谢大家的关注,我们下期再见!
在这里插入图片描述


http://www.kler.cn/a/577797.html

相关文章:

  • linux 命令sed
  • QT中使用C++调用 python脚本
  • 驱动开发系列45 - Linux 显卡KMD驱动代码分析(六)- 显卡驱动与OS接口
  • 小迪安全-27-php开发,tp框架,路由访问,对象操作,内置过滤,核心漏洞
  • 2.2.1 网络原理-posix api
  • #9 【code】实现扩散模型的一个jupyter notebook
  • PX4中的DroneCAN的实现库Libuavcan及基础功能示例
  • 【Hadoop】什么是Zookeeper?如何理解Zookeeper?
  • 记录小白使用 Cursor 开发第一个微信小程序(一):注册账号及下载工具(250308)
  • Dubbo+Zookeeper
  • 从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(十一) 实现服务端和客户端socketio 连接
  • 金融合规测试:金融系统稳健运行的“定海神针“
  • 物联网通过数字孪生技术实现设备状态的实时仿真和优化
  • 每日一练之移除链表元素
  • spring IOC(实现原理)
  • 基于自定义Tomcat实现资源访问的完整指南
  • 探索React:构建现代前端应用的强大框架
  • 1-1 驱动开发HelloWorld
  • 代码托管平台对比分析:Gitee与GitLab
  • SpringBoot-模拟SSE对话交互