C++入门——引用(重点!!!)

2023-11-07

引用概念

引用不是新定义一个变量,而是给已存在的变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它的引用变量共用一块内存空间。
在这里插入图片描述
类型& 引用变量名=引用实体;
(引用类型必须和引用实体是同样类型的)

引用特性

1.引用在定义时必须要初始化(必须说明是哪个变量的引用)
2.一个变量可以有多个引用
3.引用一旦引用一个实体,就不能引用其他实体

在这里插入图片描述
在main函数里面,调用swap 函数,swap的两个参数是引用类型,即cc的引用为m,dd的引用为n。当n和m,改变的时候,cc,dd也会改变。

在数据结构单链表里面,我们通常用二级指针来改变头指针。
但是如果运用了引用,把原本的struct ListNode**pphead ,变为
struct ListNode*&phead 。当phead改变的时候,对应的struct ListNode*头指针变量也会改变。
当然,在有的教材当中,会在定义结构体的时候,就会定义结构体指针变量,如图上的PTNode,所以就会定义引用PTNode&phead;会稍微难理解点。

C++,引用不能完全替代指针,C++要兼容C,所以不能把指针取代了。

常引用(const)

在这里插入图片描述

可以对常量引用

const int& cc = 10;

引用权限只能平移或者缩小,不能放大。

const int a = 10;
	int& rra = a;

const 修饰的常变量,只可读。
但是用引用rra,是int 型,(可读可写),权限放大了,就不可以了。
权限平移:

	const int a = 10;
	const int& rra = a;

	int b = 20;
	int& rrb = b;

权限缩小:

	int b = 20;
	const int& rrb = b;


void fun(int x)
{}

int main()
{
	int a = 10;
	const int b = 20;
	const int& rra = a;//rra是a的引用,rra权限缩小

	fun(a);
	fun(b);
	fun(rra);
}

这里传给x 只是拷贝,对于x的改变,不会影响a,b,rra;

void fun(int& x)
{}

int main()
{
	int a = 10;
	const int b = 20;
	const int& rra = a;//rra是a的引用,rra权限缩小

	fun(a);
	fun(b);
	fun(rra);
}

这里是别名,x的改变就会导致传过来的数改变的,但是由于b,rra 权限受限,他们只可读不可写,所以不可以。
所以一般引用做参数的时候,都是用const引用(非常有意义)

void fun(const int &x)

这样a,b,rra就都可以了。
但是如果要去修改就不能用这样了,只能保证传过来,为了去减少拷贝,但是不可以去修改值,因为有const 修饰



double d=12.34;
int sd=d;
int &rd=d;
const int&rrd=d;

不管是隐式转换还是强制转换,都会有一个临时变量
比如上面的sd,把d的值给sd,隐式转换为int,是有一个临时变量是int型的,把转换好的给临时变量,再去给sd,d本身没有变。
在这里,rd引用的不是d,而是那个临时变量(具有常性,也就是只可读),现在要i引用为int,那就是可读可写,是不可以的。
但是 变成前面有const修饰的,rrd就可以,此时的rrd就是那个临时变量的值,就是12。



关于const缺省参数:

void fun(int&a=10)//这个不可以,前后不一致
void fun(const int &a=10)//这个可以

使用场景

1.做参数(输出型参数)

在这里插入图片描述
Swap1的left和right 没有空间。
Swap2的left和right 要开空间的,是实参的临时拷贝。
引用做参数的好处:
1.减少拷贝,提高效率
2.输出型参数,函数中修改形参,实参也修改了

2.做返回值(引用返回)

传值返回

在这里插入图片描述
传值返回,都会生成一个临时变量,小的话就在寄存器,大的话就在上一层栈帧里。
该临时变量根据返回值给,比如此时返回值是int,那么这个临时变量就是int类型。
首先这个变量n是在静态区里面的,当Count函数return n的时候,把n的值放在临时变量里面,然后Count函数栈帧销毁。但此时n在静态区不影响临时变量。
在这里插入图片描述
这里的n没有static修饰,就说明此时n就在Count的函数栈帧上开辟的空间。
生成的临时变量里面存放着n的值,当Count 栈帧销毁的时候,n也会销毁,但是此时已经把值给了临时变量了,所以不影响。

引用返回

在这里插入图片描述
这里的n有static 修饰,但又看到返回值是int &,是引用类型,代表着临时变量也是一个引用类型,是n的别名。
当Count函数栈帧销毁,但是n却在静态区不受影响,所以n的别名不受影响。
在这里插入图片描述
在这里,不一样的是没有了static的修饰,那么当Count函数栈帧销毁的时候,n也会销毁,此时n的别名,这块地址不受保护
就会出现下面几个情况:
1.这块空间没有分配给别人,并且原来n这块地方也没有清除,那么可以正常访问,没有影响。
2.这块空间没有分配给别人,但是数据被清除了。
3.这块空间已经分配给了别人,别人也已经重现写了新的数据,原来的值被覆盖了,所以返回的ret是不确定的!
在这里插入图片描述
**结论:**出了函数作用域,返回变量不存在了,不能用引用返回,因为引用返回的结果是未定义的。
出了函数作用域,返回变量存在,才能用引用返回。
返回变量存在无非就是在堆上,在静态区,就是不能在栈上,不然会出问题。

引用和指针的区别

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++入门——引用(重点!!!) 的相关文章

随机推荐

  • SpringBoot常用注解

    实体类常用注解 Data 注在类上 提供类的get set equals hashCode canEqual toString方法 AllArgsConstructor 注在类上 提供类的全参构造 NoArgsConstructor 注在类
  • Linux基础命令-date设置时间

    Linux基础命令 history历史记录 文章目录 前言 一 date命令的介绍 二 语法及参数 2 1 用help或man查看语法 2 2 常用参数 三 参考实例 3 1 以默认格式输出系统当前的时间和日期 3 2 按照 年 月 日 的
  • 深入理解Java中的自增

    引言 i 和 i的区别在学习程序设计的时候应该就已经学过 一个是用完再加 一个是加完再用 那么考虑一下下面的代码 int i 0 for int j 0 j lt 100 j i i 这个运行完 i的值应该是多少呢 深入理解自增 上面的代码
  • Java基础语法教学视频,MySql知识体系总结(SQL优化篇

    备注 因为mysql优化器的缘故 与索引顺序不一致 也会触发索引 但实际项目中尽量顺序一致 5 联合索引 但其中一个条件是 gt 6 联合索引 order by where和order by一起使用时 不要跨索引列使用 三 单表sql优化
  • LDO低压差线性稳压器

    LDO 转自 http baike baidu com view 1042146 htm 百科名片 LDO是low dropout regulator 意为低压差线性稳压器 是相对于传统的线性稳压器来说的 传统的线性稳压器 如78xx系列的
  • 元宇宙产业委一届二次全会召开 同步举办共享大会和全球元宇宙大会

    2022全球元宇宙大会 上海站将于8月18 19日在沪召开 央链直播快讯 2022年8月18 19日 由中国移动通信联合会主办 上海市通信管理局联合主办 众视Tech 中移联会展部 中国移动通信联合会元宇宙产业委员会承办 BIC EURON
  • Aop反射机制实现某个参数值 修改

    项目中使用敏感字段的加解密 但是有的是直接在url中拼接的 所以我就想根据一个自定义注解的方式做匹配 修改值 利用反射的机制实现值的修改 以下是具体的代码 依赖aop
  • VSCode顶端文件名多行显示

    VScode默认顶端一行显示所有打开的文件名 1 直接在设置中搜索 多行 在 Workbench Editor Wrap Tabs 前选中即可 2 也可用快捷键 Ctrl P 查看最近浏览文件记录
  • 2023华为od机试 Python 实现【德州扑克】

    前言 本题使用Python解答 如果需要Java代码 请参考 链接 题目 我们可以选择五张牌 它们的范围是 每张牌的大小在2 10之间 或者字母J Q K A 牌花色为红桃 黑桃 梅花 方块四种花色之一 现在一共有6种牌型 牌型1 同花顺
  • 运维体系框架标准化模型简介

    为什么要做标准化 标准化的过程实际上就是对运维对象的识别和建模过程 形成统一的对象模型后 各方在统一的认识下展开有效协作 然后针对不同的运维对象 再抽取出它们所对应的运维场景 接下来才是运维场景的自动化实现 这有点像我们学的面向对象编程的思
  • Fabric.js

    Fabric js是什么 Fabric js 是一个简化HTML5 Canvas开发的Javascript库 Fabric js提供了HTML5 Canvas本身缺失的对象模型 交互层 SVG解析器以及其他一整套工具 它是一个完全开源的项目
  • C中的预编译宏定义

    C中的预编译宏定义 作者 infobillows 发表日期 2007 09 15 21 34 点击数 1507 在将一个C源程序转换为可执行程序的过程中 编译预处理是最初的步骤 这一步骤是由预处理器 preprocessor 来完成的 在源
  • 根据文字长度,设置文字滚动的速度

    div class tips box span class scroll text span div 根据文字长度设置中文滚动时间 const animateTextlength this conference importantInfo
  • pygame模块介绍

    pygame模块介绍 在python中开发游戏 通常会用到pygame这个模块 pygame模块总览 模块 作用 cdrom 管理cdrom设备和音频播放 cursors 加载光标图像 包括标准光标 display 控制显示窗口或屏幕 dr
  • FCN学习:Semantic Segmentation(摘自知乎)

    源文章地址 https zhuanlan zhihu com p 22976342 utm source tuicool utm medium referral FCN学习 Semantic Segmentation 余俊 计算机视觉及深度
  • 计算机图形学年鉴:研究现状、应用和未来

    计算机图形学是支持各种影视特效 三维动画影片 计算机游戏 虚拟现实以及大家手机上各种照片视频美化特效背后的技术基础 在本文中 微软亚洲研究院网络图形组深入解释了图形学的现状 发展和未来 谈及 计算机图形学 可能很多人会觉得很有距离感 或者和
  • 微信小程序弹窗提示:wx.showToast、wx.showModal、wx.showLoading的使用场景与实现

    1 wx showToast 使用场景 常规的提示 没有确定和取消按钮 例 属性 title 提示的内容 icon 显示的图标 合法值有success error loading none image 自定义图标的本地路径 优先级高于ico
  • K8S部署步骤:8-部署Master节点

    kubernetes master节点包含的组件 etcd flannel docker kube apiserver kube scheduler kube controller manager 目前这三个组件需要部署在同一台机器上 ku
  • python面试的3大重点,让你顺利拿到offer!

    5月已经过去大半个月了 马上就要迎来毕业季了 你准备好去面试了么 W3C咨询了不少python爬虫岗位从业者 如果你也打算从事python爬虫岗位 掌握这三个重点 能让你更顺利的get到理想的offer 1 Python 因为面试的是Pyt
  • C++入门——引用(重点!!!)

    文章目录 引用概念 引用特性 常引用 const 使用场景 1 做参数 输出型参数 2 做返回值 引用返回 引用和指针的区别 引用概念 引用不是新定义一个变量 而是给已存在的变量取了一个别名 编译器不会为引用变量开辟内存空间 它和它的引用变