C++入门——函数重载
C++入门——函数重载
一、什么是函数重载?
- 自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。
- 函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数或类型或类型顺序)不同,常用来处理实现功能类似但数据类型不同的问题。
1.参数个数不同型
如图所示:
在这里,我们定义了两个函数,它们的函数名相同,都为Add,从字面上也能知道它们的功能。但是二者的区别在于参数个数不同,第一个是完成的是两个整型的加法,第二个则是三个整型的加法,因此,在调用两个函数时,传参个数也不同。
2.参数类型不同
如图所示:
这里是参数的类型不同,一个是int型,另一个是double型。
3.参数类型的顺序不同
如图所示:
这里并不是参数名称顺序不同,而是参数的数据类型的顺序不同,比如这里就是先int后double还是先double后int。
注意事项
- 仅有返回值的类型不同并不能构成函数重载
如图所示:
- 函数重载针对的是同名函数的形参列表,根据函数调用时的传参来匹配调用哪一个函数,与函数里面具体的定义没有关系,如图所示:
在这里,同样是func函数,一个是实现两个数字相加,一个是实现三个数字相乘,它们的定义不同,但是由于传参个数的差异能够在调用的时候区分开来,构成重载。 - 让我们来看这样一段代码:
明确地讲,这里确实构成了函数重载,但由于这里使用的缺省参数,导致在不传参的情况下,调用这两个函数都可以,正如报错里所说,调用不明确。
我们知道,C语言是不支持函数重载的,C++能够支持。那么,为什么C++能够支持函数重载呢?让我们接着往下看,一探究竟!
二、函数重载的深入理解
1.编译链接过程详解
(1)预处理——生成.i文件
- 头文件展开、去掉注释、宏替换、条件编译……
- 我们用Linux操作系统来演示一下:
首先,写上一段C语言代码:
然后,输入指令,生成预处理后的文件test1.i
如图:
这个文件很长,有800多行,因为展开了头文件<stdio.h>,最后才是刚刚的代码。
(2)编译——生成.s文件
- 检查语法,生成汇编代码。
- 同样,我们用Linux来演示一下:
输入指令,生成编译后的文件test1.s,如图所示:
这是汇编语言。
(3)汇编——生成.o文件
- 将汇编代码转化为机器可以识别的二进制码。
直接用vim看是看不出来的,是一堆乱码:
- 我们可以用一些查看工具:
xxd
(4)链接
- 生成可执行文件——
.exe
(Windows)或者a.out
(Linux)
2.C++是怎么支持函数重载的?
- 调试代码,右击转入反汇编:
在上图中,调用函数需要call
(StackPush)函数的地址,而这两个函数的地址是不同的,那么,在函数名相同的情况下,C++是怎么区分重载函数的呢? - 我们还是使用Linux写一段代码:
这里func函数是重载函数,它们的参数个数不同。我们来看一下具体的内容:
这里就是两个重载的func函数Z4funci和Z4funcid,4表示的是函数名的长度,i
表示的是参数为int,d
表示参数为double型,这是就C++的函数名修饰规则,将重载函数区分。
因为C++具有的函数名修饰规则,函数重载得以实现。
三、本期总结+下期预告
本期内容为大家详细介绍了C++中的函数重载,下期内容将为大家带来引用的内容!
感谢大家的关注,我们下期再见!