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

news2024/11/25 16:56:56

目录

一、缺省参数

二、函数重载

三、引用

3.1 引用的概念和定义

3.2 引用的特征

3.3 引用的使用

3.4 const引用

3.5 指针和引用的关系


一、缺省参数

缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值,在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参,缺省参数分为全缺省和半缺省参数。(有些地方把缺省参数也叫默认参数)。

void Func(int a = 0)
{
 cout << a << endl;
}
int main()
{
 Func(); 
}

    在这个函数中“int a”就是缺省形参,“10”就是缺省值,当使用该函数没有传参时就会使用缺省值,传参时就会使用指定参数。

• 全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值,C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。

void func(int a=1.,int b,int c=2)

{

}

    上面这种给缺省参数就是错误的写法,必须从右往左连续缺省,中间不能断。

• 带缺省参数的函数调用,C++规定必须从左到右依次给实参,不能跳跃给实参。

• 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省 值。

    避免声明和定义时缺省参数写的不一样,编译器就不清楚该用哪个缺省值。

二、函数重载

    C++⽀持在同⼀作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同,这样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;
}

这样在用到Add加法函数时就很舒服,不用考虑整型和浮点型

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;
}

    注意:返回值不同不能作为重载条件,因为调用时也无法区分。

     下面两个函数构成重载,但是调用时,会报错,存在歧义,编译器不知道调用谁   

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

    给上了缺省值,在调用到 "f1()"时就会有歧义,直接报错。

三、引用

3.1 引用的概念和定义

    引用不是新定义⼀个变量,而是给已存在变量取了⼀个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同⼀块内存空间。比如:水浒传中李逵,江湖上人称"黑旋风"。

类型&引用别名=引用对象

    C++中为了避免引入太多的运算符,会复用C语⾔的⼀些符号,比如前面的>>,这里引用也和取 地址使用了同⼀个符号&,注意使用方法角度区分就可以。

int main()
{
 int a = 0;
 // 引⽤:b和c是a的别名 
 int& b = a;
 int& c = a;
 // 也可以给别名b取别名,d相当于还是a的别名 
 int& d = b;
 ++d;
 // 这⾥取地址我们看到是⼀样的 
 cout << &a << endl;
 cout << &b << endl;
 cout << &c << endl;
 cout << &d << endl;
 return 0;
}

 

3.2 引用的特征

• 引用在定义时必须初始化

• ⼀个变量可以有多个引用

• 引用⼀旦引用⼀个实体,再不能引用其他实体

nt main()
{
 int a = 10;
 
 // 必须初始化引⽤ 

 int& b = a;
 int c = 20;

 // 这⾥并⾮让b引⽤c,因为C++引⽤不能改变指向, 
 // 这⾥是⼀个赋值 
 b = c;
 cout << &a << endl;
 cout << &b << endl;
 cout << &c << endl;
 return 0;
}

3.3 引用的使用

• 引用在实践中主要是于引用传参和引用做返回值中减少拷贝提高效率和改变引用对象时同时改变被引用对象。

• 引用传参跟指针传参功能是类似的,引用传参相对更⽅便⼀些。

void Swap(int& rx, int& ry)
{
 int tmp = rx;
 rx = ry;
 ry = tmp;
}
int main()
{
 int x = 0, y = 1;
 cout << x <<" " << y << endl;
 Swap(x, y);
 cout << x << " " << y << endl;
 return 0;
}

• 引用和指针在实践中相辅相成,功能有重叠性,但是各有特点,互相不可替代,C++的引用跟其他语言的引用(如Java)是有很大的区别的,除了用法,最大的点,C++引用定义后不能改变指向, Java的引用可以改变指向。

• ⼀些主要用C代码实现版本数据结构教材中,使用C++引用替代指针传参,目的是简化程序,避开复杂的指针。

3.4 const引用

• 可以引用⼀个const对象,但是必须用const引用,const引用也可以引用普通对象,因为对象的访 问权限在引用过程中可以缩小,但是不能放大。

int main()
{
 const int a = 10;
 // 编译报错: “初始化”: ⽆法从“const int”转换为“int &” 
 // 这⾥的引⽤是对a访问权限的放⼤ 
 //int& ra = a;
 // 这样才可以 
 const int& ra = a;
 // 编译报错: “ra”: 不能给常量赋值 
 //ra++;
 // 这⾥的引⽤是对b访问权限的缩⼩ 
 int b = 20;
 const int& rb = b;
 // 编译报错: “rb”: 不能给常量赋值 
 //rb++;
 return 0;
}

• 不需要注意的是类似 int& rb = a*3; double d = 12.34; int& rd = d; 这样⼀些场 景下a*3的和结果保存在⼀个临时对象中, int& rd = d 也是类似,在类型转换中会产⽣临时对 象存储中间值,也就是时,rb和rd引用的都是临时对象,而C++规定临时对象具有常性,所以里就触发了权限放大,必须要用常引用才可以。

int main()
{
 int a = 10;
 const int& ra = 30;
 
 // 编译报错: “初始化”: ⽆法从“int”转换为“int &” 
 // int& rb = a * 3;
 const int& rb = a*3;
 double d = 12.34;
 // 编译报错:“初始化”: ⽆法从“double”转换为“int &” 
 // int& rd = d;
 const int& rd = d;
 return 0;
}

• 所谓临时对象就是编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象, C++中把这个未命名对象叫做临时对象。 

3.5 指针和引用的关系

    C++中指针和引用就像两个性格迥异的亲兄弟,指针是哥哥,引用是弟弟,在实践中他们相辅相成,功能有重叠性,但是各有自己的特点,互相不可替代。

• 语法概念上引用是⼀个变量的取别名不开空间指针是存储⼀个变量地址,要开空间

引用在定义时必须初始化指针建议初始化,但是语法上不是必须的

• 引用在初始化时引用⼀个对象后,就不能再引用其他对象,而指针可以在不断地改变指向对象。 • 引用可以直接访问指向对象,指针需要解引用才是访问指向对象。

• sizeof中含义不同,引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下 占4个字节,64位下是8byte)

• 指针很容易出现空指针和野指针的问题,引用很少出现,引用使用起来相对更安全⼀些。


     本篇内容就到这里,希望对各位有帮助,如果有错误欢迎指出。

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

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

相关文章

数据结构预备知识

目录 1. 什么是集合框架 2. 什么是数据结构 3. 容器背后对应的数据结构 4. 相关java知识 5. 时间复杂度 6. 空间复杂度 7. 包装类 7.1 装箱和拆箱 7.2 阿里面试题&#xff1a; 8. 泛型 8.1 泛型的语法 8.2 泛型怎样编译 9. 泛型的上界 9.1 语法 9.2 泛型方法 1.…

网络通信要素

网络介绍 定义&#xff1a;将具有独立功能的多台计算机通过通信线路和通信设备连接起来&#xff0c;在网络管理软件及网络通信协议下&#xff0c;实现资源共享和信息传递的虚拟平台。 学习网络的目的&#xff1a; 能够编写基于网络通信的软件或程序&#xff0c;通常来说就是网…

CentOS7下制作openssl1.1.1i RPM包并升级

OpenSSL最新漏洞 OpenSSL官方发布了拒绝服务漏洞风险通告&#xff0c;漏洞编号为CVE-2020-1971 漏洞详情 OpenSSL是一个开放源代码的软件库包&#xff0c;应用程序可以使用这个包来进行安全通信&#xff0c;避免窃听&#xff0c;同时确认另一端连接者的身份。这个包广泛被应…

爆了,20w点赞!收好这6个可以一键替换视频人物的AI工具!(建议收藏)

用 AI 一键替换视频中人物角色的玩法&#xff0c;彻底被网友们带火了&#xff01; 前有机器人插秧、机器人做饭做家务的视频&#xff0c;后有机器人打乒乓球、美女踢足球的视频。 这类视频动辄几万、几十万点赞&#xff0c;流量也太猛了&#xff01; 图片可能不太直观&#x…

时空自回归模型(STAR)及 Stata 具体操作步骤

目录 一、引言 二、文献综述 三、理论原理 四、实证模型 五、稳健性检验 六、程序代码及解释 附录 数据预处理 生成时空权重矩阵 一、引言 时空自回归模型&#xff08;Spatial-Temporal Autoregressive Model&#xff0c;简称 STAR&#xff09;在分析具有时空特征的数…

Java填充PDF并返回填充后PDF文件及对应base64码

前期准备 下载PDF编辑工具&#xff08;Adobe Acrobat 9 Pro&#xff09;&#xff1a; 可以主页关注小程序【白哥Java】回复【PDF编辑软件】即可获取 或者直接联系博主也可 主页如下&#xff1a; 软件使用流程 此处流程为文本域流程 图片或其他大致相同 生成模板PDF样式如下&…

Linux命令行参数与环境变量

目录 命令行参数与环境变量 命令行参数 环境变量及其相关概念 环境变量的相关操作 环境变量的本质 命令行参数与环境变量 命令行参数 我们在使用一些Linux的一些指令时&#xff0c;会有意或无意的使用一些指令参数&#xff0c;例如&#xff1a; ls -al ps -ajx gcc -o …

CVE-2024-38077 微软 RDP 漏洞修复 报错 不适用于你的计算机 解决方法

这一漏洞存在于Windows远程桌面许可管理服务&#xff08;RDL&#xff09;中&#xff0c;该服务被广泛部署于开启Windows远程桌面&#xff08;3389端口&#xff09;的服务器&#xff0c;用于管理远程桌面连接许可&#xff0c;也有文章认为该漏洞实际利用的是135端口。攻击者无需…

【大模型】多模态的原理简述

多模态的原理 多模态模型目前基本就是文生图、图生图、图生视频、文生视频这些&#xff0c;其底层逻辑其实还是先从生图片这一源头。因为毕竟视频也是若干帧的图片组成。 所以在生图片的这个环节上&#xff0c;我们把比较火的这个stablediffusion用的这个diffusion扩散模型理…

企业大数据治理管理平台解决方案(33页PPT)

方案介绍&#xff1a; 本解决方案旨在为企业提供一套从数据采集、存储、处理、分析到应用的全链条大数据治理管理平台。该平台通过集成先进的数据技术和管理理念&#xff0c;帮助企业实现数据的全生命周期管理&#xff0c;提升数据质量&#xff0c;降低数据风险&#xff0c;促…

PX4-Autopolite linux环境下源码编译中遇到的一些问题及相应解决办法

最近在做一个PX4飞控移植的项目&#xff0c;第一次接触到PX4源码&#xff0c;真的是感觉编译起来非常的麻烦&#xff0c;下面我将介绍几个新手比较容易踩坑的点。 &#xff08;我都踩了ㄒ-ㄒ&#xff09; 1.PX4源码要用git clone 从github上克隆来&#xff0c;千万不要直接在g…

谷粒商城实战笔记-170~172-缓存-SpringCache

文章目录 一&#xff0c;170-缓存-SpringCache-自定义缓存配置二&#xff0c;171-缓存-SpringCache-CacheEvict1&#xff0c;删除多个缓存2&#xff0c;删除一个缓存 三&#xff0c;172-缓存-SpringCache-原理与不足 一&#xff0c;170-缓存-SpringCache-自定义缓存配置 上一节…

中国对世界各国的进出口面板数据(2000-2022年)

中国作为全球最大的贸易国之一&#xff0c;其对各国的进出口数据不仅量级庞大&#xff0c;而且蕴含着丰富的经济信息与趋势动向&#xff0c;对于研究全球经济互动、国际贸易格局、产业链分布以及中国自身经济的发展策略具有一定价值。例如&#xff0c;近年来的数据表明&#xf…

对接的广告平台越多,APP广告变现的收益越高?

无论是游戏、社交、工具应用类APP还是泛娱乐类APP&#xff0c;流量变现的方式主要有广告、内购、订阅三种方式。其中&#xff0c;广告变现是门槛最低、适用最广的变现方式。 只要APP有流量&#xff0c;就可以进行广告变现&#xff0c;让APP的流量快速转化为商业价值。作为最常…

什么是张量

张量的基础概念 学习使用pytorc库进行深度学习网络搭建时&#xff0c;张量这个词总是不定时会出现。其实&#xff0c;Pytorch中的所有操作都是在张量的基础上进行的&#xff0c;今天就来了解张量到底是什么 由PyTorch官网官网介绍可知&#xff0c;一个Tensor是一个包含单一数据…

软件测试自学三个月,进了一家自研薪资11k,面试总结分享给大家

功能方面&#xff1a;问得最多的就是测试流程&#xff0c;测试计划包含哪些内容&#xff0c;公司人员配置&#xff0c;有bug开发认为不是 bug怎么处理&#xff0c;怎样才算是好的用例&#xff0c;测试用例设计方法&#xff08;等价类&#xff0c;边界值等概念方法&#xff09;&…

DVWA靶场配置相关问题解决

本文主要提到鄙人在DVWA配置过程中所遇到的问题&#xff0c;以及我的解决方式&#xff0c;希望会帮到大家&#xff01; 首先&#xff0c;我使用的是windows版本&#xff0c;运用的是小皮搭建&#xff0c;前期准备可参考&#xff1a;【靶场搭建】超级详细——DVWA靶场搭建&…

springboot美术馆管理系统--论文源码调试讲解

第2章 开发环境与技术 本章节对开发美术馆管理系统管理系统需要搭建的开发环境&#xff0c;还有美术馆管理系统管理系统开发中使用的编程技术等进行阐述。 2.1 技术路线 在美术馆管理系统中常用的技术方案如下所展示&#xff1a; 针对已有的购物中心&#xff0c;系统结构为B…

ChatGPT:智能聊天机器人微信开发实战

简介 ChatGPT近期以强大的对话和信息整合能力风靡全网&#xff0c;可以写代码、改论文、讲故事&#xff0c;几乎无所不能&#xff0c;这让人不禁有个大胆的想法&#xff0c;能否用他的对话模型把我们的微信打造成一个智能机器人&#xff0c;可以在与好友对话中给出意想不到的回…

微信分享朋友圈单页面设置

需求:用户在朋友圈打开分享的小程序页面&#xff0c;并不会真正打开小程序&#xff0c;而是进入一个“小程序单页模式”的页面,需要自定义单页面样式 第一步:先读官方文档 分享到朋友圈 | 微信开放文档 由官方文档可知,当进入单页面会返回一个场景值1154,判断如果是1154就展示…