【基础】函数重载
重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,
但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个运算符完成不同的运算功能。
这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。但是重载函数的返回值类型可以不同。(来自百度百科)
举个例子
我们要写个求绝对值的函数,因为数据类型不同,导致我们要写一个 整形 和一个 浮点型 一共两个名字不同的求绝对值函数,使用的时候也需要根据变量类型的不同而进行选择
(上面一行所说的前提是在没有或不用函数重载的情况下,并非所有语言都有函数重载这一功能)
但通过函数重载,我们可以把两个函数都命名为同一个名字
![](https://images2018.cnblogs.com/blog/1183108/201803/1183108-20180301232223508-671523139.jpg)
![](https://images2018.cnblogs.com/blog/1183108/201803/1183108-20180301232258057-1151126309.jpg)
值得注意的是,函数重载以 函数参数 作为判断 两个同名的函数 是否是 两个不同的函数的依据
so,改函数的函数类型标识符是没有用的
//错误示例 int abs(int a){ ... } double abs(int a){ ... }
像上面的两个函数,当在 mian 函数中调用 abs 函数时
int main(){ int a; cin >> a; abs(a); return 0; }
系统就会因为不知道调用哪个函数而报错
函数重载规则:
- 函数名称必须相同。
- 参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。
- 函数的返回类型可以相同也可以不相同。
- 仅仅返回类型不同不足以成为函数的重载。
//错误示例 #include <iostream> using namespace std; int test(int x, int y=5){ ... } int test(int x){ ... } int main(){ int x; cin >> x; test(x); return 0; }
这么写的时候,编译器编译的时候肯定会“懵逼”
这种写法会产生歧义,编译器也不知道你要调用的是哪一个函数
最后,把两个功能完全不同的两个函数命名为同一个名字,这样子是会被拉出去祭天的
/* 摘要:计算 x + y 的值 */ #include <iostream> using namespace std; int test(int x, int y){ return x - y; } int test(int x, double y){ return x + y; } int main(){ int x = 9; int y_1 = 2; double y_2 = 3.0; cout << test(x,y_1) << endl; cout << test(x,y_2) << endl; return 0; }
补充:
函数重载仅仅是语法层面的,本质上它们还是不同的函数,占用不同的内存,入口地址也不一样
函数签名:
函数签名(Function Signature),函数签名包含了一个函数的信息,包括函数名、它的参数类型、它所在的类和名称空间及其他信息。
函数签名用于识别不同的函数,就像签名用于识别不同的人一样,函数的名字只是函数签名的一部分。
参考资料:
https://www.cnblogs.com/wfwenchao/articles/4140388.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!