【C++初阶(二)】缺省参数函数重载

news2025/3/1 21:27:16

目录

 

 前言

1. 缺省参数

 1.1 什么是缺省参数

 1.2 缺省参数的分类

 1.2.1 全缺省参数

 1.2.2 半缺省参数

2. 函数重载

 2.1 什么是函数重载

 2.2 缺省参数与函数重载

 2.3 函数重载的使用

 3. C++支持函数重载的原因

 总结


前言

 

        在学习C语言时我们就会发现,C语言中存在的许多规则使得C语言在使用时非常的不方便,例如在函数调用时必须要传参没有默认值,函数不可以重名等等问题,C++作为C的改进版,对C语言的缺陷进行了改进,同时也兼容C的语法。在C++中上述问题都得到了解决,也就是缺省参数和函数重载,接下来我将向大家详细介绍C++的缺省参数和函数重载。

a6c0473e16e249c2b9ca02e5b793f35e.gif#pic_center

1. 缺省参数

 1.1 什么是缺省参数

         缺省参数是指在函数定义时为参数提供默认值,使得在调用函数时可以选择性地省略该参数。当调用函数时省略了对应的参数,函数会使用默认值来代替。

 比如:

void Func(int a = 10)
{
    cout << "a = " << a << endl;
    
}

int main()
{
	Func();//没有传参时使用参数的默认值
    Func(2);//传参时使用的是指定参数

	return 0;
}

 1.2 缺省参数的分类

     1.2.1 全缺省参数

         函数的所有参数都设置了默认值,在调用函数时可以省略所有参数。比如:

void Func(int a = 10, int b = 20, int c = 30)
{
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    cout << "c = " << c << endl;
}

int main()
{
	Func();
    
	return 0;
}

 1.2.2 半缺省参数

        半缺省参数是指在函数的部分参数设置了默认值,使得在调用函数时可以省略这些参数。比如:

void Func(int a = 10, int b = 20, int c = 30)
{
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    cout << "c = " << c << endl;
}

int main()
{
	Func(1,2);
    
	return 0;
}

 使用注意

  •  缺省参数中,半缺省缺省值只能从右往左进行缺省,且必须是连续的

 比如:

int main()
{
	Func( ,1,2);//缺省位置从右向左,不可以中断
    
	return 0;
}
  •  缺省参数声明和定义不能同时给

 比如:

//定义 fun.c
void Func(int a = 10)
{
    cout << "a = " << a << endl;
}

//声明 fun.h
void Func(int a = 2);

        声明与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定该用那个缺省值。应该在声明中给,如果只在定义中给,那么在其他文件调用时就无法达到缺省的效果。(函数声明是告诉编译器函数的存在,不在声明中写,那么在其他接口调用时,编译器就不会认为有默认值)。

  • 缺省值必须是常量或者全局变量
  •  C语言不支持

2. 函数重载

        自然语言中,一个词可以有多重含义(一词多义),人们可以通过上下文来判断该词真实的含义,相同的名称,却有不同的作用与意义。在C++中函数重载也是如此。

 2.1 什么是函数重载

         函数重载是指在同一个作用域内,可以定义多个同名函数,但这些函数的参数列表不同,调用时编译器会根据参数列表、来确定调用哪个同名函数。

 比如:

int Add(int left, int right)
{
	cout << "int Add(int left, int right)" << endl;
	return left + right;
}
double Add(double left, double right)
{
	cout << "double Add(double left, double right)" << endl;
	return left + right;
}
int main()
{
	Add(1, 1);
	Add(3.14, 3.62);
	return 0;
}

 定义两个同名的Add函数,在进行函数调用时,编译器会根据传递的参数来选择调用哪个函数。

 但如果一个传int类型,一个传double类型就会出现报错:

e35809768ec24e98be7f7d90cb2d5803.png

 传进去的参数与参数列表里的参数不匹配。

 

 2.2 缺省参数与函数重载

         有缺省参数也可以构成重载,但在使用时需要注意避免造成歧义。比如:

void fun()
{
	cout << "fun()" << endl;
}
void fun(int a = 0)
{
	cout << "fun(int a)" << endl;
}
void fun(int a)
{
	cout << "fun(int a)" << endl;
}

 aeb1641ff77b4487b8bc31ef89048c56.png

         在调用fun不传参时,fun()和fun(int a=0)都符合条件,这样就存在二义性,编译器在调用时不知道该调用哪一个。在结合使用时可以使用,但要避免类似这种二义性情况(尽量不要这样使用)。

 2.3 函数重载的使用

         函数重载可以依据参数类型不同而进行匹配,并选择调用函数,参数类型不同可分为:参数类型不同,参数个数不同,参数顺序不同。

//1.参数类型不同
int fun(int a)
{
	cout << "int fun(int a)" << endl;
	return a;
}
double fun(double b)
{
	cout << "double fun(double b)" << endl;
	return b;
}
// 2、参数个数不同
void f()
{
	cout << "f()" << endl;
}
void f(int a)
{
cout << "f(int a)" << endl;
}
// 3、参数类型顺序不同
void func(int a, char b)
{
	cout << "f(int a,char b)" << endl;
}
void func(char b, int a)
{
	cout << "f(char b, int a)" << endl;
}

 这些都可以构成函数重载。

但要注意:

参数相同时,返回值不参与重载的规则

比如:

int f(int a)
{
	return 0;
}
double f(int a)
{
	return 2.1;
}

        如果两个函数的函数名相同、参数也相同,仅依靠返回值不同,是无法构成函数重载的(存在二义性)。

 3. C++支持函数重载的原因

     为什么C++支持函数重载而C语言不支持呢?

在 C/C++ 中,要运行一个程序,需要经过:编译和链接两大过程。

 详细可见:程序员进阶之路:程序环境和预处理

 程序大概执行流程:

cbaa91d744984f869b1f0d9dd81bc5dd.png

         C语言在编译阶段会产生一个符号表,在链接函数地址时,C语言通过符号表(函数名)去找。所以C语言不存在同名函数。

         C++在编译时会通过特殊修饰产生独特的字符(地址),通过地址寻找函数,以Linux环境下为例更为直观:

 Linux函数名修饰规则:

 _Z  函数名字符个数   函数名  参数首字母

 以 fun(int a,char b) ,fun(char b,int a) 为例,修饰后:_Z3funic、_Z3funci

 我们通过VS调试也可以看到,test.s文件如下:

186c765d2c2542dc9b8f5b3355e8e869.png

 不同的编译器有不同的修饰规则。这也就是C++为什么可以支持函数重载。


 总结

         缺省参数和函数重载是C++语言中非常有用的特性,它们可以帮助我们更好地组织和管理代码。在学习和使用这两个特性时,我们需要注意一些细节,以确保代码的正确性和可读性。以上便是本期的全部内容,希望对你有所帮助。最后感谢阅读!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1107252.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 Python 交互式方法预测股票价格变动概率

一、简介 当深入金融世界时,了解股价走势是一个显着的优势。在这里,我们提出了一种交互式方法,可以根据历史数据深入了解股价达到某些目标的可能性。 该工具利用 Python 强大的库,信息丰富且视觉上引人入胜。所提供的工具不会预测未来价格,而是评估价格波动的历史频率,让…

牛客网 -- WY28 跳石板

题目链接&#xff1a; 跳石板_牛客题霸_牛客网 (nowcoder.com) 解题步骤&#xff1a; 参考代码&#xff1a; void get_approximate(vector<int>& v,int n) {//求约数&#xff0c;从2到sqrt(n)即可&#xff0c;原因看图解//这里一定要等于sqrt(n)&#xff0c;例如16…

数据挖掘(6)聚类分析

一、什么是聚类分析 1.1概述 无指导的&#xff0c;数据集中类别未知类的特征&#xff1a; 类不是事先给定的&#xff0c;而是根据数据的相似性、距离划分的聚类的数目和结构都没有事先假定。挖掘有价值的客户: 找到客户的黄金客户ATM的安装位置 1.2区别 二、距离和相似系数 …

轻量级超分网络:Edge-oriented Convolution Block for Real-timeMM21_ECBSR 和 eSR

文章目录 ECBSR&#xff08;Edge-oriented Convolution Block for Real-timeMM21_ECBSR&#xff09;1. 作者目的是开发一个高效的适合移动端的超分网络。2. 作者决定使用plain net &#xff0c;但是效果不好&#xff0c;因此利用重参数化方法&#xff0c;丰富特征表示。3. re-p…

【数字人】6、ER-NeRF | 借助空间分解来实现基于 NeRF 的更高效的数字人生成(ICCV2023)

文章目录 一、背景二、方法2.1 问题设定2.2 Tri-Plane Hash Representation2.3 Region Attention Module2.4 训练细节 三、效果3.1 实验设定3.2 定量对比3.3 定性对比3.4 User study3.5 消融实验 四、代码4.1 视频数据预处理4.2 训练4.3 推理 论文&#xff1a;Efficient Region…

springboot+jaspersoft studio6制作报表

文章目录 前言一、开发工具下载安装二、开始制作1.新建1.文本2.图片3. 表格4.时间 三.遇到的问题1.中文不显示2.detail模块与column Footer之间有空白。怎么调节也消不掉 四.完整代码总结 前言 公司最近要做报销系统。需求就是将报销申请、报销审批。并将报销信息打印出来。 …

Nginx配置微服务避免actuator暴露

微服务一般在扫漏洞的情况下&#xff0c;需要屏蔽actuator健康检查 # 避免actuator暴露 if ($request_uri ~ "/actuator") { return 403; }

SD/SDIO(1):SD总线协议介绍

SD标准提供了很大的灵活性&#xff0c;除了作为存储卡外&#xff0c;还提供了SD卡槽的标准来扩展设备的功能。本篇文章就先来介绍一下SD总线的规范。对于SD/MMC协议的发展历史和概念介绍&#xff0c;可以参考我的这篇文章&#xff1a;SD、SDIO和MMC接口基础和规范介绍 文章目录…

【MySQL】数据库——库操作

文章目录 1. 创建数据库[IF NOT EXISTS] 的使用 2. 删除库3. 数据库的编码问题查看系统默认支持的字符集查看系统默认支持的校验集只查看 database的校验集指定编码创建数据库修改字符集修改校验集验证规则对数据库的影响utf8_general_ci ——不区分大小写utf8_bin ——区分大小…

【Qt之布局】QVBoxLayout、QHBoxLayout、QGridLayout、QFormLayout介绍及使用

在Qt中&#xff0c;布局管理器&#xff08;Layout&#xff09;用于管理窗口中的控件的位置和大小&#xff0c;以适应不同大小的窗口。 常用的布局管理器包括QVBoxLayout、QHBoxLayout、QGridLayout和QFormLayout。 先放张布局UI&#xff1a; 1. QVBoxLayout&#xff08;垂直布…

【爬虫教程】2023最详细的爬虫入门教程~

初识爬虫 学习爬虫之前&#xff0c;我们首先得了解什么是爬虫。 来自于百度百科的解释&#xff1a; 网络爬虫&#xff08;又称为网页蜘蛛&#xff0c;网络机器人&#xff0c;在FOAF社区中间&#xff0c;更经常的称为网页追逐者&#xff09;&#xff0c;是一种按照一定的规则&a…

视频批量加水印:保护版权,提升效率

在当今的自媒体时代&#xff0c;视频制作已经成为许多人的一项必备技能。然而&#xff0c;在视频制作过程中&#xff0c;如何为自己的视频添加独特的水印以保护知识产权&#xff0c;常常让许多制作者感到困扰。本文将为你揭示如何通过固乔剪辑助手软件&#xff0c;简单几步批量…

音乐播放器蜂鸣器ROM存储歌曲verilog,代码/视频

名称&#xff1a;音乐播放器蜂鸣器ROM存储歌曲 软件&#xff1a;Quartus 语言&#xff1a;Verilog 代码功能&#xff1a; 设计音乐播放器&#xff0c;要求至少包含2首歌曲&#xff0c;使用按键切换歌曲&#xff0c;使用开发板的蜂鸣器播放音乐&#xff0c;使用Quartus内的RO…

VUE前端判断是电脑端还是移动端

背景需求 ruoyi框架&#xff0c;前后端分离。现在要在用户访问的时候根据不同的设备跳转到不同的登录页面。 教程 router/index.js 修改src/router/index.js&#xff0c;在这里增加自己的要跳转的页面 permission.js 在白名单中添加自己的登录页面 增加以下识别的代码 le…

solidworks 2024新功能之-打造更加智能的工作 硕迪科技

SOLIDWORKS 2024 的新增功能 SOLIDWORKS 的每个版本都致力于改进您的工作流程&#xff0c;使您常用的工具尽可能快速高效地运作。此外&#xff0c;SOLIDWORKS 2024 可以通过量身定制的解决方案扩展您的工具集&#xff0c;并使您能够通过 Cloud Services 轻松将您的设计数据连接…

vue 写一个大富翁 和 老虎机组件

大富翁 老虎机https://github.com/YaminZheng/zillionaire.git Vue Ts 编写的大富翁&#xff0c;支持自定义路径&#xff0c;动画和图片可以自行添加 Dev git clone https://github.com/YaminZheng/zillionaire.git cd zillionaire yarn set version stable yarn install …

文心大模型4.0亮相2023百度世界大会,助力各赛道应用进一步发展

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

Map<String, Object> 和 com.fasterxml.jackson.databind.node.ObjectNode区别

Map<String, Object>和com.fasterxml.jackson.databind.node.ObjectNode都可以用来表示一个键值对集合&#xff0c;其中键是字符串&#xff0c;值可以是任何对象。 Map<String, Object>是Java标准库中的一种数据结构&#xff0c;用于存储一组键值对。它是一个接口…

【Electron】Not allowed to load local resource

问题描述 使用 audio 标签播放音频文件&#xff0c;控制台报错 Not allowed to load local resource。 Not allowed to load local resource原因分析 通常是安全策略所引起的。Electron 默认情况下禁止加载本地资源&#xff0c;以防止潜在的安全风险。 解决方案 在 main.js…

1208. 翻硬币

题目&#xff1a; 1208. 翻硬币 - AcWing题库 思路&#xff1a; 1.对于要求从A变化到B的这类题&#xff0c;可以采用开关控制的方法。 2.一次翻转连续两个硬币&#xff0c;求origin变为result 最少需要翻转多少次。我们在origin的两个硬币中间放一个开关&#xff0c;开关变换…