C++初阶语法——引用,从此和指针说byebye

前言:相信学过C语言的同学肯定被指针深深折磨过,从一级指针到二级指针,数组指针,函数指针等等,可谓是谈针色变。而在C++中,使用引用代替了指针的使用,大大降低了我们学习的难度。

引用

  • 一.什么是引用
  • 二.引用的特性(限制)
  • 三.传引用传参(引用做参数)
  • 四.传引用返回(引用做返回值)
    • 1.传值返回(与传引用返回对比)
    • 2.传引用返回
    • 3.传引用返回示例
  • 五.引用权限问题

一.什么是引用

引用并不是新定义了一个变量,而是给已经存在的变量取了个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间
以孙悟空为例,他又叫做齐天大圣,斗战胜佛,所以我们说齐天大圣就能想到孙悟空。
格式:类型& 引用变量名 = 引用实体

可以看到,a和b的地址是一样的。在这里插入图片描述#

二.引用的特性(限制)

1.引用在定义时必须初始化
2.一个变量可以有多个引用
3.引用一旦引用一个实体,就不能再引用其它实体(这点与指针略有不同,因为指针是可以改变指向的对象的)

void test()
{int a = 10;int b = 20;//int& ra;  //编译出错,引用在定义时必须初始化int& ra = a;int& rra = a;  //ra,rra都是a的别名,地址是一样的。//int& ra = b;  //ra已经是a的别名,不能再作为其它变量的别名。
}

三.传引用传参(引用做参数)

我们知道C语言中用函数交换两个变量需要传址调用,而在C++中可以直接用引用替代,方便理解的同时也不需要在进行解引用,这在存在二级及以上指针的时候极大地提高了代码的可读性。

//C语言写法
//void Swap(int* a, int* b)
//{
//	int tmp = *a;
//	*a = *b;
//	*b = tmp;
//}//引用C++写法
void Swap(int& a, int& b)
{int tmp = a;a = b;b = tmp;
}
int main()
{int a = 10;int b = 20;Swap(a, b);cout << "a = " << a << endl;   // 20cout << "b = " << b << endl;   // 10return 0;
}

四.传引用返回(引用做返回值)

这是一个重点内容,在后续学习默认成员函数时会经常出现。
先说结论:如果函数返回时,出了函数作用域,如果返回对象还在,则可以使用引用返回,否则必须使用传值返回。

1.传值返回(与传引用返回对比)

请看这段代码,你觉得打印ret会显示什么? 答:1
函数栈帧销毁,在使用传值返回时会使用临时变量存储n,临时变量具有常属性

这里是引用

2.传引用返回

问:打印ret会显示什么?
传引用返回,返回的是n的别名,但是函数栈帧已经销毁了,因此这时候ret有两种情况,随机值或者是1,这取决于这块栈帧空间是否被重置。(博主在VS上运行结果是1)
这里是引用

3.传引用返回示例

使用传引用返回可以简化操作,如下例代码,原本顺序表的查找和修改两个接口通过传引用返回可以直接合并成一个接口

typedef struct Seqlist {int* a;int capacity;int size;
}SL;
//C接口设计
//返回第i个位置的值
int SLFind(SL* Seq, int i)
{assert(i < Seq->size);//...return Seq->a[i];
}
//修改第i个位置的值
void SLModify(SL* Seq, int i,int x)
{assert(i < Seq->size);//...Seq->a[i] = x;
}//C++接口设计
int& SLFM(SL* Seq, int i)
{assert(i < Seq->size);//...return Seq->a[i];
}
int main()
{SL* s1;//SLFind(s1,2) = 10  // 不可行,因为传值返回的值具有常属性,不能被修改。SLFM(s1, 2) = 10; //将第2个位置的值修改成10return 0;
}

五.引用权限问题

对于具有常属性的变量等需要注意:在使用引用时,权限可以缩小,平移,但是不能放大。

int main()
{const int a = 10;int ar = a;  //这是单纯的赋值,不存在权限问题。//int& b = a;  //权限放大,原本a具有常属性,但是别名b没有,将a的权限放大了。const int& c = a; // 权限平移,a,c都具有常属性int x = 20;const int& d = x;  //权限缩小,别名d具有常属性,而引用实体x没有,将x的权限缩小了。return 0;
}

拓展:

以下代码你知道错在哪里吗?
在这里插入图片描述
或许有读者会认为是类型不匹配,实则不然:这里的错误是权限放大,加上const就不会标红了。
在这里插入图片描述
原因:x是int类型,而i是double类型,会发生类型转换,将x给给一个double类型的临时变量,而临时变量具有常属性,因此如果不加const就会发生权限放大。

文末BB:对哪里有问题的朋友,尽管在评论区留言,若哪里写的有问题,也欢迎朋友们在评论区指出,博主看到后会第一时间确定修改。最后,制作不易,如果对朋友们有帮助的话,希望能动动你们发财的小手给点点赞和关注.
在这里插入图片描述

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

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

相关文章

Node.js新手在哪儿找小项目练手?

前言 可以参考一下下面的nodejs相关的项目&#xff0c;希望对你的学习有所帮助&#xff0c;废话少说&#xff0c;让我们直接进入正题>> 1、 NodeBB Star: 13.3k 一个基于Node.js的现代化社区论坛软件&#xff0c;具有快速、可扩展、易于使用和灵活的特点。它支持多种数…

sentinel简单使用

核心demo&#xff1a; 1 引入依赖: <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-core</artifactId><version>1.8.0</version> </dependency>2 核心代码&#xff1a; 3 限流保护代码&#xff1a;…

如何搭建一个成功的酒店小程序?

随着移动互联网的发展&#xff0c;小程序成为了不可忽视的商业工具之一。对于酒店行业来说&#xff0c;开发一个酒店预订小程序可以为客户提供更加便捷的预订方式&#xff0c;同时也带来了更多的商机。下面&#xff0c;我们将介绍一个简单的搭建流程&#xff0c;帮助新手快速上…

uC-OS2 V2.93 STM32L476 移植:系统移植篇

前言 上一篇已经 通过 STM32CubeMX 搭建了 NUCLEO-L476RG STM32L476RG 的 裸机工程&#xff0c;并且下载了 uC-OS2 V2.93 的源码&#xff0c;接下来&#xff0c;开始系统移植 开发环境 win10 64位 Keil uVision5&#xff0c;MDK V5.36 uC-OS2 V2.93 开发板&#xff1a;NUC…

怎么样通过Bootstrap已经编译好(压缩好)的源码去查看符合阅读习惯的源码【通过Source Map(源映射)文件实现】

阅读本篇博文前&#xff0c;建议大家先看看下面这篇博文&#xff1a; https://blog.csdn.net/wenhao_ir/article/details/132089650 Bootstrap经编译(压缩)后的源码百度网盘下载地址&#xff1a; https://pan.baidu.com/s/14BM9gpC3K-LKxhyLGh4J9Q?pwdm02m Bootstrap未经编译…

element vue2 动态添加 select+tree

难点在 1 添加一组一组的渲染 是往数组里push对象 循环的&#xff1b;但是要注意对象的结构! 因为这涉及到编辑完成后&#xff0c;表单提交时候的 校验&#xff01; 是校验每一个select tree里边 是否勾选 2 是在后期做编辑回显的时候 保证后端返回的值 是渲染到 select中的tr…

【云原生】详细学习Docker-Swarm部署搭建和基本使用

个人主页&#xff1a;征服bug-CSDN博客 kubernetes专栏&#xff1a;云原生_征服bug的博客-CSDN博客 目录 Docker-Swarm编排 1.概述 2.docker swarm优点 3.节点类型 4.服务和任务 5.路由网格 6.实践Docker swarm 1.概述 Docker Swarm 是 Docker 的集群管理工具。它将 Doc…

Tik Tok本土mcn怎么入驻,泰国市场发展概况分析!

近日&#xff0c;TikTok海外本土MCN机构“Ma Go”获得数千万级别的A轮融资&#xff0c;本轮融资由北太平投资独家投资。 2021年10月份&#xff0c;“Ma Go”曾获得过知名投资人以及网红朱一旦的千万级别融资。 Ma Go联合创始人倪泽铭表示&#xff0c;本轮融资将继续扩展申请找…

阿里云官方关于数据安全保护的声明

“阿里云监控用户的数据流量&#xff1f;”“真的假的&#xff1f;”随着近日早晨 朱峰肥鹅旅行 对阿里云的一条朋友圈截图传遍了整个IT圈。 对于网络上的各种传播&#xff0c;以下是阿里云的官方答复&#xff0c;原文如下&#xff1a; 关于数据安全保护的声明 今天有客户反映…

SpringBoot 的事务及使用

一、事务的常识 1、事务四特性&#xff08;ACID&#xff09; A 原子性&#xff1a;事务是最小单元,不可再分隔的一个整体。C 一致性&#xff1a;事务中的方法要么同时成功,要么都不成功,要不都失败。I 隔离性&#xff1a;多个事务操作数据库中同一个记录或多个记录时,对事务进…

语法糖是什么?

目录 一、基本概念二、编程语言中常见的语法糖1、 JAVA2. JavaScript3. Python4、 C 一、基本概念 语法糖&#xff08;Syntactic Sugar&#xff09;是编程中的一个概念&#xff0c;指的是一种在语法上更简洁、更易读、更易书写&#xff0c;但实际上并没有引入新的功能或特性的…

【owt】erzio的handler和pipeline

【owt】erzio的PipelineBase::addService licode学习之erizo篇–Pipeline_handle 大神分析的非常细致: 大神 总结:erizo的pipeline的handler是负责实际数据处理的,通过处理链路,将之串联起来 大神还绘制了基础类图: pipleline 负责读写数据包并处理数据包 创建:static Pt…