【C++】缺省参数和函数重载

news/2024/5/8 14:54:22/文章来源:https://blog.csdn.net/m0_71503225/article/details/137385625

 

目录

1.缺省参数

1.1缺省参数的定义

1.2  缺省参数的简单应用 

1.3 缺省参数分类:全缺省参数和半缺省参数

1.3.1半缺省参数

1.3.2全缺省参数

3.缺省参数注意事项:缺省参数不能在函数声明和定义中同时出现  

4.函数重载

4.1 函数重载概念

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

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

4.4 顺序不同也可以归类为类型不同

5.c++支持函数重载/c语言不支持函数重载的原因


 

1.缺省参数

1.1缺省参数的定义

缺省参数是声明或定义函数时函数的参数指定一个缺省值。在调用该函数时,如果没有指定实 参则采用该形参的缺省值,否则使用指定的实参。

void Print(int x = 8)
{cout << x << endl;}

这里的x就是一个缺省参数,如果我们调用这个函数的时候我们给函数传入参数,则使用的是我们传入的参数,如果我们调用这个函数不给这个函数传入参数,则某认使用缺省参数的值。

1.2  缺省参数的简单应用 

在我们写栈的初始化或者顺序表的初始化的时候,如果我们知道要开多大的空间,我们可以直接给函数传入空间大小的值,如果不知道的情况下,我们可以利用缺省参数固定开多少空间。使得函数参数调用非常灵活。

void Func(int a = 10, int b = 20, int c = 30)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}int main()
{Func();Func(1);Func(1,2);Func(1,2,3);return 0;
}

1.3 缺省参数分类:全缺省参数和半缺省参数

1.3.1半缺省参数

参数缺省部分

特点:缺省值只能从右往左给,必须是连续的。

这两种方式都是错误的,因为函数调用传参的时候会有争议。 

1.3.2全缺省参数

函数的所有参数都设置缺省值

void Func(int a = 10, int b = 20, int c = 30)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}int main()
{Func();Func(1);Func(1,2);Func(1,2,3);return 0;
}

全缺省参数不可以之传递中间的某一个或者某几个值。不要间隔着传

3.缺省参数注意事项:缺省参数不能在函数声明和定义中同时出现  

因为害怕函数声明的时候是一个参数值,函数定义的时候又是一个参数值,没有办法有一个标准

但是也不能定义是缺省参数,函数声明没有, 所以如果声明和定义分离,只能在声明地方给缺省参数。因为有些地方只用到函数的声明,所以以声明为主,然后定义可以不用给。

缺省值一般是常量或者全局变量,但是一般是变量 ,c语言不支持缺省。

4.函数重载

在汉语或者自然语义中,一个词通常有多个意义,人们可以根据不同的环境和语态来理解一个词的不同意思比如:卧槽,那么我们就说这个词被重(chong)载了.

4.1 函数重载概念

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

也就是说函数名可以相同但是参数不同(参数的个数,类型,顺序不同)但是对返回值没有要求(可同可不同)

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

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(10, 20);Add(10.1, 20.2);return 0;
}

看着是两个相同的函数,但是编译器会去匹配,C语言不可以这样写

如果我们使用:Add(1,2.2)这样的方式传参,编译会报错,因为我们知道整型和浮点型之间是会有隐式类型转换的,对于两个参数来说到底是double转int还是int 转double是有争议的,所以编译不过,

但是我们要是屏蔽其中一个函数就可以编译通过:

因为此时就没有争议了。

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

// 2、参数个数不同
void f()
{cout << "f()" << endl;
}
void f(int a)
{cout << "f(int a)" << endl;
}int main()
{/*Add(10, 20);Add(10.1, 20.2);*/f();f(10);return 0;
}

函数重载和缺省参数

缺省参数的有和没有不影响两个同名函数构成函数重载,因为属于参数个数不同的类型,但是在调用这两个函数的时候,不传参数的情况下就有歧义

4.4 顺序不同也可以归类为类型不同

// 3、参数类型顺序不同
void f(int a, char b)
{cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{cout << "f(char b, int a)" << endl;
}

为什么不能是返回值不同:

返回值不同不能够构成区分函数的条件,存在调用歧义。

5.c++支持函数重载/c语言不支持函数重载的原因

多文件编译的时候是需要使用函数名去寻找函数地址的,因为只有函数声明,同名函数要得以区分就要用函数名修饰规则。

在代码编译运行的过程中,在编译阶段会形成符号汇总,这时候的函数声明等没有具体的地址,具体的地址是函数实现的地址,但是编译器会让通过,就像打了一个欠条,在汇编的时候形成符号表,这个时候将函数名和地址合在一起,形完整的符号表,后续调用这个函数,就可以call这个函数的地址。C语言不存在同名函数,链接函数时就用函数名去找。

 

但是c++中 存在同名函数,寻找函数地址时就不以函数去找,不同编译器下的解决方案不同,在在linux下:

linux下函数名修饰规则:call函数的时候使用这样的地址去找这个函数,类型不同修饰的函数就不同,得以区分同名函数)

_Z是前缀   +函数名的字符个数+函数名+参数的首字母

gcc编译c语言代码:使用函数名寻找

 

g++编译,:使用修饰过后的函数名去寻找,区分了同名函数。

 

不同的编译器区分规则是不一样的,linx下更直观一些。

6.结语

上述就是今天分享的内容,如果大家觉得有用,创作不易,希望收获三连。我是Nicn,欢迎一起交流学习。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年32款数据分析工具分五大类总览

数据分析工具在现代商业和科学中扮演着不可或缺的角色&#xff0c;为组织和个人提供了深入洞察和明智决策的能力。这些工具不仅能够处理大规模的数据集&#xff0c;还能通过强大的分析和可视化功能揭示隐藏在数据背后的模式和趋势。数据分析工具软件主要可以划分为以下五个类别…

uniapp Android 开发手机模拟器调试接口出现 Failed to connect to localhost/127.0.0.1:9999

{“errMsg”:“request:fail abort statusCode:-1 Failed to connect to localhost/127.0.0.1:9999”} 原因&#xff1a;使用模拟器或者手机调用API接口&#xff0c;首先保证在同一局域网&#xff0c;然后要使用 IPV4 的 IP 地址。 打开 cmd 输入 ipconfig 查看 ip 地址 替换代…

【java】spring打包找不到主类

背景 使用IDEA打包spring 一直报错&#xff0c;&#xff1a;IDEA spring Error: Could not find or load main class 解决 添加maven的打包命令&#xff1a; 添加&#xff0c;打包依赖到 jar包中 package assembly:single

蓝桥杯练习系统(算法训练)ALGO-958 P0704回文数和质数

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 一个数如果从左往右读和从右往左读数字是完全相同的&#xff0c;则称这个数为回文数&#xff0c;比如898,1221,15651都是回文数。编写…

创新指南|贝恩的产品经理RAPID框架:解决问题的分步指南,使决策过程既高效又民主

您是否曾发现自己陷入项目的阵痛之中&#xff0c;决策混乱、角色不明确、团队成员之间的冲突不断升级&#xff1f;作为产品经理&#xff0c;驾驭这艘船穿过如此汹涌的水域可能是令人畏惧的。应对这些挑战的关键在于采用清晰、结构化的决策方法。输入贝恩的 RAPID 框架&#xff…

Linux文件搜索工具(gnome-search-tool)

opensuse下安装: sudo zypper install gnome-search-tool 操作界面:

【Spring】SpringBoot整合Redis,用Redis实现限流(附Redis解压包)

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 本文介绍SpringBoot整合Redis并且进行接口的限流&#xff0c;文章主要介绍的是一种思想&#xff0c;具体代码还要结合实际。 一、Windows安装Redis Redis的解压包我放在了百度网盘上&#xff0c;有需要的可以下载。 R…

【第七篇】使用BurpSuite进行主动、被动扫描和主动、被动爬虫

文章目录 前言主动扫描被动扫描主动爬虫被动爬虫前言 Burp Scanner 既可以用作全自动扫描仪,也可以用作增强手动测试工作流程的强大手段。 扫描网站涉及两个阶段: 抓取内容和功能: Burp Scanner 首先在目标站点周围导航,密切反映真实用户的行为。它对站点的结构和内容以及…

06 Php学习:字符串

PHP 中的字符串变量 在 PHP 中&#xff0c;字符串是一种常见的数据类型&#xff0c;用于存储文本数据。字符串变量可以包含字母、数字、符号等字符&#xff0c;并且可以进行各种操作和处理。以下是关于 PHP 中字符串变量的一些重要信息&#xff1a; 定义字符串变量&#xff1…

Spring boot 入门 ---(一),2024年最新java进阶训练营

spring-snapshots http://repo.spring.io/snapshot spring-milestones http://repo.spring.io/milestone spring-boot-starter-parent是使用Spring Boot的一种不错的方式&#xff0c;但它 并不总是最合适的。有时你可能需要继承一个不同的父POM&#xff0c;或只是不喜欢我…

JVM面试整理--对象的创建和堆

文章目录 对象的创建过程是怎样的?对象在内存中的结构是怎样的&#xff08;专业的叫法&#xff1a;对象的内存布局&#xff09;对象在内存分配时使用的哪种方式&#xff08;有的地方也称为&#xff1a;分配算法&#xff09;知道什么是“指针碰撞”吗&#xff1f;知道什么是“空…

不允许在constexpr函数中进行声明

这是我用pycharm在windows系统下复现sfm深度学习网络(Deep Two-View Structure-from-Motion Revisited&#xff09;遇见的问题&#xff0c;复现时有段代码pytorch扩展cuda/c&#xff0c;pycharm中出现C标准相关的报错如下&#xff1a; 在网上查找很久无果&#xff0c;后面通过…

JVM垃圾收集——垃圾收集器

文章目录 1、垃圾收集器的发展和分类1.1、评估垃圾收集器的性能指标1.1.1、吞吐量1.1.2、停顿时间1.1.3、吞吐量和停顿时间的比较 1.2、垃圾收集器的发展史1.3、垃圾收集器的分类1.4、查看默认的垃圾收集器 2、Serial收集器&#xff1a;串行回收3、ParNew收集器&#xff1a;并行…

【漏洞复现】深澜计费管理系统任意文件读取漏洞

0x01 产品简介 深澜计费管理系统是一套完善的、领先的具有复杂生物型特征的弹性认证计费系统。其主要由以下几个模块组成&#xff1a;AAA认证计费平台、系统运营维护管理平台、用户及策略管理平台、用户自助服务平台、智能客户端模块、消息推送模块以及数据统计模块。该系统为…

Qt Creator实例之图标主题

Chart themes 是 Qt Creator 中图表的主题&#xff0c;它可以用于改变图表的外观和风格&#xff0c;使其更符合你的需求和设计。此示例显示了所有支持的图表类型的不同内置主题的外观。为了给结果一个更和谐的外观&#xff0c;应用程序的背景调色板是根据所选主题定制的。 char…

Mybatis-Plus05(分页插件)

分页插件 MyBatis Plus自带分页插件&#xff0c;只要简单的配置即可实现分页功能 1. 添加配置类 Configuration MapperScan("com.atguigu.mybatisplus.mapper") //可以将主类中的注解移到此处 public class MybatisPlusConfig {Bean public MybatisPlusIntercepto…

功能测试如何到自动化测试,看这篇就够了。

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号&#xff1a;互联网杂货铺&#xff0c;回复1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;薪资嘎嘎涨 本帖不仅给大家介绍自动化测试&#xff0c;更会提供大…

GFS 分布式文件系统

目录​​​​​​​ GlusterFS简介 GlusterFS特点 GlusterFS 术语 GlusterFS 的工作流程 弹性 HASH 算法 GlusterFS的卷类型 分布式卷 条带卷 复制卷 分布式条带卷 分布式复制卷 条带复制卷 分布式条带复制卷 搭建GFS 节点配置 ​编辑 客户端配置 测试 Glust…

提示工程概要

提示工程 1. 两大原则 原则 1&#xff1a;编写清晰具体的说明 使用分隔符 三引号&#xff1a;“”"三个反引号&#xff1a;三个破折号&#xff1a;—尖括号&#xff1a;<>XML标签&#xff1a; 要求结构化输出 HTMLJSONXMLPython字典 检查条件是否满足 检查执行…

13 指针(上)

指针是 C 语言最重要的概念之一&#xff0c;也是最难理解的概念之一。 指针是C语言的精髓&#xff0c;要想掌握C语言就需要深入地了解指针。 指针类型在考研中用得最多的地方&#xff0c;就是和结构体结合起来构造结点(如链表的结点、二叉树的结点等)。 本章专题脉络 1、指针…