2024年C C++最新【C C++】深入理解--函数重载(什么是函数重载,2024年最新2024C C++开发社招面试解答之性能优化

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

🍉为什么要有函数重载

🍓为何C语言不支持函数重载,反倒C++可以?

💦 Linux环境下演示函数重载

💦结论

四、总结与提炼

五、共勉


一、前言

自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者是“谁也赢不了!”,后者是“谁也赢不了!”

同时—我们在平时写代码中也会用到几个函数但是他们的实现功能相同,但是有些细节却不同。例如:交换两个数的值其中包括(int, float,char,double)这些个类型。在C语言中我们是利用不同的函数名来加以区分。

void Swap1(int* a, int* b);            ---- int 类型
void Swap2(float* a, float* b);        ---- float 类型
void Swap3(char* a, char* b);          ---- char 类型
void Swap4(double* a, double* b);      ---- double 类型

我们可以看出这样的代码不美观而且给程序猿也带来了很多的不便。于是在C++中人们提出了用一个函数名定义多个函数,也就是所谓的函数重载。

二、 函数重载

🍎什么是函数重载

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

简单来说,C++允许同一作用域中出现函数名相同,参数不同,功能相似的函数,而这些函数就构成函数重载。

void Swap(int* a, int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}
 
void Swap(double* a, double* b)
{
	double temp = *a;
	*a = *b;
	*b = temp;
}
//这两个函数就构成函数重载

这两个函数就构成函数重载

注意:

对于函数重载这个概念,我们在学习C语言的时候是没有听过的,因为在C语言中是不存在函数重载概念的。只有在.cpp的文件中,我们才可以进行函数重载

🍐函数重载的条件

**第一要满足:**函数名相同

第二要满足:参数不同,具体表现在参数类型的顺序、参数的个数、参数的类型

参数的类型不同的函数重载

参数的个数不同的函数重载

参数类型的****顺序不同

🍇函数重载的注意点

仅仅修改函数返回类型-------- 不能称为函数重载

因为无法区分你要调用的是谁

🍉为什么要有函数重载

C语言不支持同一作用域存在同名函数,那么我们修改一下函数名不就行了吗?函数重载真正能体现价值的地方到底在哪呢?

第一:书写函数名方便。

比如,我们要写两个交换函数,第一个是交换两个整形,第二个是交换两个浮点型,那么你只需要都取Swap即可,不需要写成Swapi、Swapd,如果参数复杂呢?你又要写成什么呢?

到不如直接写成Swap,然后传不同的参数,编译器会自动匹配最符合的函数。

第二:类中构造函数的实现也依靠函数重载

构造函数是同名的成员函数,它一般被划分为:有参构造、无参构造、拷贝构造,它们构成函数重载。

第三:模板的底层实现也依靠函数重载

模板的其实就是让编译器就为你创建重载函数,比如Swap(const T& a,const T&b)

当你传两个整形给a和b时,编译器会自动生成Swap(int* a,int* b),当你传两个浮点型double时,编译器会自动生成Swap(double* a,double* b)。

以上等等C++中好用的机制都依靠于函数重载,函数重载在C++中的地位不言而喻。

🍓为何C语言不支持函数重载,反倒C++可以?

有了函数重载,确实要比不支持函数重载的C语言上方便了许多,这难免会有人提问到:

  1. 既然函数重载这么好,为何C语言就不行呢?
  2. C++又是如何支持函数重载的呢?

接下来,我就展开来讨论下:首先,为了更好的显现出其具体操作过程,我将在Linux的环境下向大家展示其具体过程。其次,解释其原理需要借助我们之前讲解过的程序编译链接,所以下文我也会带着再简要讲解下。所以,正文开始:

💦 Linux环境下演示函数重载
  • gcc编译 – C语言版本

首先,我们在Linux环境下创建3个目录:fun.hfun.ctest.c。来分别进行声明、定义、实现。

注意后缀,都是以.c命名,这说明以下操作是在C语言的情况下进行的

对上述代码编译运行后没有错误,接下来用gcc编译对它生成 tc 可执行程序.

接下来,我们在原有文件的基础上再写一个函数来确保其是****函数重载

此时我们用gcc对它进行编译:

很明显发生错误,再强调下,上述操作是在C语言的基础上完成的。这就足矣说明,C语言是不支持函数重载的,想要搞清楚原因前,就要先明白程序的编译链接,看下文:

回顾程序的编译链接

程序的编译链接我在曾经的一篇博文中已详细讲解过,这里直接给出链接:
程序环境的编译链接

针对上述的三个目录文件:fun.h、fun.c、test.c,接下来展开讨论:

程序的编译链接分为四大过程:

  1. 预处理 – 头文件展开、宏替换、条件编译、去掉注释。预处理后生成fun.itest.i文件
  2. 编译 – 检查语法,生成汇编代码。编译后生成fun.stest.s文件
  3. 汇编 – 把汇编代码转换成二进制的机器码。汇编后生成fun.otest.o文件
  4. 链接 – 合并段表、符号表的合并和符号表的重定位。通俗讲就是找调用函数的地址,链接对应上,合并到一起

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

链接对应上,合并到一起**

[外链图片转存中…(img-8EVr8zgK-1715555615208)]
[外链图片转存中…(img-Md01gvJd-1715555615209)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 28
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值