C++缺省参数、函数重载、引用

一、缺省参数

1.1缺省参数概念

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

void func(int n = 0)
{cout << n << endl;
}int main()
{func();func(10);return 0;
}

        如上代码,在func()没有传参时参数会采用该形参的缺省值n=0,当函数传入确定的参数时,缺省值则不会使用,而是采用指定的实参。

1.2缺省参数分类

        缺省参数共分为两类,为:全缺省参数和半缺省参数。

        全缺省参数是函数在调用时不传入任何参数,完全调用设置的缺省值进行传参。

        半缺省参数是函数在调用时传入部分参数并不传入所有的参数,对于自行传入的实参,函数会调用所传入的参数,对于剩下的没有传入的则是使用设置的缺省参数进行传参。(注意:半缺省参数必须从右往左依次来给出,不能间隔着给)

void Date(int year = 2024, int month = 5, int day = 7)
{cout << year << "年" << month << "月" << day << "日" << endl;cout << endl;
}int main()
{Date(2024, 5, 1);Date(2024, 5);Date(2024);Date();return 0;
}

1.3注意事项

1. 半缺省参数必须从右往左依次来给出,不能间隔着给。
2. 缺省参数不能在函数声明和定义中同时出现。

//a.hvoid Func(int a = 10);// a.cppvoid Func(int a = 20);// 注意:如果声明与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该
用那个缺省值。

3. 缺省值必须是常量或者全局变量。
4. C语言不支持(编译器不支持)

二、函数重载

        在我们日常语言中一句话、一个词往往会有着多重的含义,人们通常要联系上下文和使用语境来判断具体意思,比如说我喜欢上一个人和我喜欢上一个人,由此我们可以把第一句话理解为我喜欢上了一个人,第二句话可以理解为我喜欢 / 上一个/ 人。所以说这句话被重载了。

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

// 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;
}
// 2、参数个数不同
void f()
{cout << "f()" << endl;
}
void f(int a)
{cout << "f(int a)" << endl;
}
// 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;
}
int main()
{Add(10, 20);Add(10.1, 20.2);f();f(10);f(10, 'a');f('a', 10);return 0;
}

三、引用

3.1引用概念

        引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。

        比如孙悟空既叫齐天大圣也叫孙行者、弼马温等。

        类型&引用变量名(对象名) = 引用实体;

        引用类型必须和引用实体是同种类型的。

3.2引用特性

1. 引用在定义时必须初始化。
2. 一个变量可以有多个引用。
3. 引用一旦引用一个实体,再不能引用其他实体。

3.3常引用
void TestConstRef()
{const int a = 10;//int& ra = a;   // 该语句编译时会出错,a为常量const int& ra = a;// int& b = 10; // 该语句编译时会出错,b为常量const int& b = 10;double d = 12.34;//int& rd = d; // 该语句编译时会出错,类型不同const int& rd = d;
}
3.4使用场景
3.4.1做参数
void func(int& a, int& b, int c, int d)
{a++;b++;c++;d++;
}int main()
{int a = 10;int b = 20;int c = 30;int d = 40;func(a, b, c, d);cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;cout << "d = " << d << endl;return 0;
}

        由此可见,当引用当作参数时,传入的是变量本身,当在函数内对其进行改变时,改变的是主函数内变量的本身,并不是仅仅当作临时拷贝的变量,比较a、b和c、d就能知晓。

3.4.2做返回值
int& Add(int a, int b)
{int c = a + b;return c;
}
int main()
{int& ret = Add(1, 2);Add(3, 4);cout << "Add(1, 2) is :"<< ret <<endl;return 0;
}

        如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用
引用返回,如果已经还给系统了,则必须使用传值返回。

3.4.3传值、传引用效率比较

        以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效
率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。

3.4.4引用和指针的区别

        在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。

        在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。

        引用和指针的不同点:
1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
2. 引用在定义时必须初始化,指针没有要求。
3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何
一个同类型实体。
4. 没有NULL引用,但有NULL指针。
5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32
位平台下占4个字节)。
6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小。
7. 有多级指针,但是没有多级引用。
8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理。
9. 引用比指针使用起来相对更安全。

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

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

相关文章

【经验01】spark执行离线任务的一些坑

项目背景: 目前使用spark跑大体量的数据,效率还是挺高的,机器多,120多台的hadoop集群,还是相当的给力的。数据大概有10T的量。 最近在出月报数据的时候发现有一个任务节点一直跑不过去,已经超过失败次数的阈值,报警了。 预警很让人头疼,不能上班摸鱼了。 经过分析发现…

Apache Knox 2.0.0使用

目录 介绍 使用 gateway-site.xml users.ldif my_hdfs.xml my_yarn.xml 其它 介绍 The Apache Knox Gateway is a system that provides a single point of authentication and access for Apache Hadoop services in a cluster. The goal is to simplify Hadoop securit…

LANCET:常见统计使用错误+规避建议!

国际顶级医学期刊《柳叶刀》&#xff08;The Lancet&#xff09;最近发表了一篇实用的通讯文章&#xff08;Correspondence&#xff09;&#xff0c;该篇Correspondence基于过去3年内对提交给《柳叶刀》的1000多篇manuscripts进行审核的经验&#xff0c;总结了科研report中常见…

IOC 和 DI

IOC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09;和DI&#xff08;Dependency Injection&#xff0c;依赖注入&#xff09;是面向对象编程中的两个重要概念&#xff0c;它们之间有密切的关联。 IOC&#xff08;控制反转&#xff09;&#xff1a; IOC是一种…

【系统架构师】-UML-用例图(Use Case)

1、概述 用于表示系统功能需求&#xff0c;以及应用程序与用户或者与其他应用程序之间的交互关系。 2、组成 参与者&#xff08;Actors&#xff09;&#xff1a;与系统交互的用户或其他系统。用一个人形图标表示。用例&#xff08;Use Cases&#xff09;&#xff1a;系统需要…

2024年第九届数维杯数学建模A题思路分享

文章目录 1 赛题思路2 比赛日期和时间3 竞赛信息4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

前端权限控制

分享一些在Vue项目中实现权限控制的方法 方法描述基于路由的权限控制使用Vue Router中的路由守卫&#xff08;beforeEach&#xff09;来检查用户权限&#xff0c;并根据权限决定是否允许导航到特定路由。基于角色的权限控制将用户的角色信息与权限关联&#xff0c;根据用户的角…

汇凯金业:黄金价格波动的原因是什么

黄金价格波动的原因通常是多方面的&#xff0c;包括但不限于&#xff1a; 经济数据&#xff1a;比如就业数据、通胀率、GDP增长率等对经济状况的指标不及预期&#xff0c;可能会增加黄金作为避险资产的吸引力。 货币政策&#xff1a;央行的利率决策、货币供应量的变化、量化宽…

山东首版次什么的要求有

在山东首版次申报中&#xff0c;测试报告是一个关键的组成部分。测试报告需要包含的内容通常与软件产品的质量、性能和安全性等方面相关。以下是在山东首版次申报中&#xff0c;测试报告可能需要包含的内容&#xff1a; 引言&#xff1a;简要介绍测试的目的、范围、背景以及测试…

当前主机使用的磁盘以及带宽情况

今日看到有用户在论坛留言反馈他买了Hostease Linux虚拟主机&#xff0c;想要查看当前主机使用的磁盘以及带宽情况&#xff0c;但是不知道如何查看。因为这边也是对于Hostease的虚拟主机产品是有所了解的&#xff0c;知道他们都是默认带管理面板的操做起来很方便的&#xff0c;…

基于FPGA的数字信号处理(10)--定点数的舍入模式(1)四舍五入round

1、前言 将浮点数定量化为定点数时&#xff0c;有一个避不开的问题&#xff1a;某些小数是无法用有限个数的2进制数来表示的。比如&#xff1a; 0.5(D) 0.1(B) 0.1(D) 0.0001100110011001~~~~(B) 可以看到0.5是可以精准表示的&#xff0c;但是0.1却不行。原因是整数是离散的…

Linux学习笔记2---Makefile

单个文件编译用gcc编译确实是挺方便的&#xff0c;但是多个文件需要编译一个个的编译就属实是麻烦了&#xff0c;而针对多文件编译也有快捷的办法&#xff0c;即Makefile脚本。要运行Makefile需要先安装make程序。 apt install make 1.什么是Makefile 一个工程中的源文件不计…

element-plus el-cascader 懒加载实现-省市区街道选择及回显

大概思路&#xff1a; 准备一个接口可以通过父Id,查询到下一级省市区街道的信息&#xff1b;如下方的getRegionListOne确定后端的数据结构&#xff0c;需要在created里边处理数据回显逻辑el-cascader接收的数据格式是[‘’,‘’,‘’];后端的数据格式多为[{provinceId: ‘’, …

Unity射线检测不到MeshCollider的原因

当我们构建的模型是单面模型时&#xff0c;就会出现射线检测不到MeshCollider的问题&#xff0c;对于渲染&#xff0c;我们可以Cull Off来实现双面渲染&#xff0c;而在射线检测时&#xff0c;Unity提供了一个API来控制是否检测背面&#xff1a;Physics.queriesHitBackfaces 案…

C语言中的精确宽度类型

概述 在 C 语言标准库 <stdint.h> 中定义了一系列精确宽度的整数类型&#xff0c;这些类型保证了它们的位数宽度&#xff0c;从而允许编写跨平台的可移植代码。以下是一些常用的精确宽度整数类型&#xff1a; int8_t: 8位有符号整数uint8_t: 8位无符号整数int16_t: 16位…

基于随机森林与支持向量机的高光谱图像分类(含python代码)

目录 一、背景 二、代码实现 三、项目代码 一、背景 基于深度学习的教程&#xff08;卷积神经网络&#xff09;详见&#xff1a;基于卷积神经网络的高光谱图像分类详细教程&#xff08;含python代码&#xff09;-CSDN博客 在高光谱图像分类领域&#xff0c;随机森林&#…

实现一个聊天室可发送消息语音图片视频表情包(任意文件)

文章目录 如何跑通代码仓库地址客户端登录发送消息接受消息发送文件接受文件 服务端接受消息并发送给各个客户端接受文件并发送给各个客户端 如何跑通 将手机和电脑都连自己的热点先运行服务器得到可监听的地址更新客户端安卓消息线程和文件线程的socker目标地址为可监听地址然…

【JAVA】Git 的基本概念和使用方式

Git是一个开源的分布式版本控制系统&#xff0c;由Linus Torvalds创建&#xff0c;用于有效、高速地处理从小到大的项目版本管理。以下是Git的一些基本概念和使用方式的深入探讨&#xff1a; 基本概念 1. 仓库&#xff08;Repository&#xff09; 仓库是Git用来保存你的项目…

go解析含passphrase的pem秘钥

背景 在编写TLS配置时需要用到需要用到一串包含passphrase的RSA秘钥&#xff0c;本想通过官方库的方式解析使用&#xff0c;但由于安全因素&#xff0c;官方已经禁用了DecryptPEMBlock、EncryptPEMBlock、IsEncryptedPEMBlock等函数&#xff0c;导致无法通过官方库去实现这个需…

Unity 委托与事件、装箱和拆箱

文章目录 前言一、委托与事件1、委托的概念2、委托是什么3、事件是什么 二、装箱和拆箱1、什么是装箱和拆箱2、堆、栈3、应用4、优化 总结 前言 一、委托与事件 1、委托的概念 不知道大家在学习C#之前有没有学习过C/C&#xff0c;在中后期会接触到指针。她不仅能指向变量的地…