C/C++每日一问--函数重载

1、今日主题

在我们学习stm32单片机做小应用、小项目的过程中,我们一般是对某一个功能的需求定义一个函数实现,比如发送一串数据:

// 向串口蓝牙发送传输四轴飞行器三维姿态角
void DataSendToUSART(float roll,float pitch,float yaw);
那我要发送另外一串数据呢,自然是再定义一个不同的函数,比如:

// 传输X ,Y,方向速度PID输出,高度
void DataSendToUSART1(int speed_X_PID,int speed_Y_PID,uint16_t height);

上面的两个函数发送的数据不同,数据类型不同,数据个数一样,函数体相同;我们发现这两个函数实现的功能其实是类似的,都是将三个数据通过串口发送出去,然后我们要根据不同的数据类型定义不同名的函数,以便调用实现数据传输。

但是如果每一组数据都要定义一个函数,取一个函数名,那每次调用的时候还需要一一比对,确定好参数,然后才进行调用。

针对这种情况,有时候过了几天再去看这个程序,会发现有点懵,不知道哪个函数对应什么数据类型,只能找到定义的函数看一眼,这样实属麻烦。

那我们能否用同一的函数名直接调用而不会导致产生问题呢?

自然有:C++的函数重载功能

函数重载,对一个函数名赋予新的含义,让一个函数名可以多用。以此实现一名多用,我们可以把函数名定义成一样,在调用函数时,系统会根据给出的信息找到与之匹配的函数,然后进行调用。这样就方便使用,便于我们记忆了。

2、实践演练

开发环境:Win10,VS2015
编程体会一下函数重载的使用,具体如下所示:

#include <iostream>
using namespace std;

int add(int a, int b)
{

  return a + b;

}

double add(double a, double b)
{

  return a + b;

}
int main()
{

  cout << add(5, 2) << endl;
  cout << add(5.2, 13.14) << endl;

  system("pause");
  return 0;
}

编译结果如下:
在这里插入图片描述
由上可知,我们定义了一个add函数来求两个不同类型数的和,在调用过程中系统会自动根据其实参的类型不同来实现准确调用。

函数重载的规则:

  • 参数列表必须不同(个数不同、类型不同、参数排列顺序必须至少有一种不同)
  • 函数的返回类型可以相同也可以不相同
  • 仅仅返回类型不同不足以成为函数的重载

重载函数通常用来在同一个作用域内,用同一个函数名命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。

3、知识裂变

1、C语言中为什么不能支持函数重载?

在C语言中,编译器在编译过程会将我们的函数重命名,具体的方法就是在我们的函数名前加上“_“修饰符,如:_add,通过这种方式就可以在我们的符号表种查找到了,但是假如有两个相同的函数,编译之后进行相同的重命名,在符号表中生成的函数名一样,那么就无法区分到底是哪个函数了,所以这也就是我们的C语言为什么不支持函数重载的原因了。

2、C++中函数重载底层是如何处理的?

在C++中支持函数重载,它对C语言在这方面进行了优化,具体的方法就是在我们的函数名后面加上参数然后生成我们符号表中的函数名称,如:?Add@@YAHHH@Z。

那么这样一来,就很容易理解了,为什么C++可以支持函数重载了,就是因为函数重载底层的原理造成的,就是由于重载函数在符号表中生成的函数名称不一样,这样就能区分到底是哪个函数了。这样一来编译就能通过了。

3、C++能否按照C语言的方式来编译文件?

可以,只需要在我们的函数前加上 extern ”C“ 即可。

资料分享

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
扫描关注公众号
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值