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

【C++】函数重载

🦄个人主页:小米里的大麦-CSDN博客

🎏所属专栏:C++_小米里的大麦的博客-CSDN博客

🎁代码托管:C++: 探索C++编程精髓,打造高效代码仓库 (gitee.com)

⚙️操作环境:Visual Studio 2022

目录

一、前言

二、函数重载的规则

三、代码示例

函数重载的原因

四、常见错误

总结 

共勉


一、前言

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

在C++中,允许在同一作用域中声明几个功能类似的同名函数函数重载(Function Overloading)是指在同一个域中,可以定义多个函数名相同参数列表不同的函数。是函数的一种特殊情况,编译器通过参数的类型、顺序和数量来区分不同的重载函数,而不仅仅是通过函数名。函数重载的关键是参数的数量、类型或顺序有所不同。常用来处理实现功能类似数据类型不同的问题。

二、函数重载的规则

  1. 参数数量不同:可以有不同数量的参数。
  2. 参数类型不同:可以有相同数量但类型不同的参数。
  3. 参数顺序不同:当参数类型不同时,可以按不同的顺序进行重载。

注意:补充返回值不同是不能进行重载的,返回值类型不作为区分重载的。

三、代码示例

#include <iostream>
using namespace std;

// 重载函数1:接受一个int参数
void display(int i) {
    cout << "Integer: " << i << endl;
}

// 重载函数2:接受一个double参数
void display(double d) {
    cout << "Double: " << d << endl;
}

// 重载函数3:接受两个int参数
void display(int i, int j) {
    cout << "Two integers: " << i << " and " << j << endl;
}

// 重载函数3:接受一个char和一个int参数
void display(char i, int j) {
    cout << "Two integers: " << i << " and " << j << endl;
}
int main() {
    display(5);          // 调用第一个重载函数
    display(3.14);       // 调用第二个重载函数
    display(2, 3);       // 调用第三个重载函数
    display('a', 4);     // 调用第四个重载函数
    return 0;
}
输出:
Integer: 5
Double: 3.14
Two integers: 2 and 3
Two integers: a and 4

函数重载的原因

  1. 简化代码:相同的功能可以通过相同的函数名实现,而不必为多种情况定义不同的函数名。
  2. 代码的约束性更好:通过相同的函数名,可以让代码具有一致性和可维护性。

四、常见错误

  1. 仅返回通过值不同进行重载是不允许的。
  2. 默认参数可能导致重载不一致。

调用func(10)时会发生歧义,编译器不知道该调用哪一个。
#include <iostream>
using namespace std;

void func(int a, int b = 5);
void func(int a);

void func(int a, int b)
{
	cout << "a = " << a << " b = " << b << endl;
}

void func(int a)
{
	cout << "a = " << a << " b = 5" << endl;
}

int main()
{
	func(10); // “func”: 对重载函数的调用不明确

	return 0;
}

【扩展:对vs下函数名修饰规则】:

C/C++ 函数调用约定-CSDN博客

总结 

C++的函数重载弥补了C语言不能重命名/重定义的缺陷,有了函数重载,会减小不会取名的程序员的负担,并且通过相同的函数名,可以让代码具有一致性和可维护性,极大增强了程序员的效率!

共勉


http://www.kler.cn/news/307840.html

相关文章:

  • Python使用pymysql返回字典类型的数据
  • yum本地源配置
  • 基于 SpringBoot 的车辆充电桩管理系统
  • 医药|基于springboot的医药管理系统设计与实现(附项目源码+论文+数据库)
  • JAVA算法数据结构第一节稀疏矩阵
  • ADB ROOT开启流程
  • C# AutoResetEvent ManualResetEvent Mutex 对比
  • 54.【C语言】 字符函数和字符串函数(strncpy,strncat,strncmp函数)
  • ip映射域名,一般用于mysql和redis的固定映射,方便快捷打包
  • python基本数据类型简记
  • vue3 组合式API defineEmits() 与 emits 组件选项
  • I²C通信协议
  • 基于SpringBoot的考研助手系统+LW参考示例
  • 模拟实现通用型排序
  • Rust练手项目,写个有趣的小工具定时从一言网获取一段有趣的话并推送通知
  • STM32—I2C
  • OpenAI o1真的那么强吗
  • 天地一体化物联网:挑战与机遇
  • 移动订货小程序哪个好 批发订货系统源码哪个好
  • 【Elasticsearch系列八】高阶使用
  • 您的计算机已被.lcrypt勒索病毒感染?恢复您的数据的方法在这里!
  • 春秋云境靶场之CVE-2022-29464
  • element-plus弹窗内分页表格保留勾选项
  • 大数据-134 - ClickHouse 集群三节点 安装配置启动
  • 【2023年】云计算金砖牛刀小试4
  • 机器学习文献|基于循环细胞因子特征,通过机器学习算法预测NSCLC免疫治疗结局
  • 24.9.16数据结构|平衡二叉树
  • 如何切换淘宝最新镜像源npm
  • C++菜鸟教程 - 从入门到精通 第二节
  • Bxbshsbsh