C++ 左值、右值、左值引用以及右值引用

news2024/9/23 19:27:01

一、左值和右值 将亡值

1.左值

左值是一个表示数据的表达式,比如:变量名、解引用的指针变量。一般地,我们可以获取它的地址对它赋值,但被 const 修饰后的左值(常性),不能给它赋值,但是仍然可以取它的地址。

总体而言,凡是能够取地址的值叫做左值。

    int a = 10;           //&a   
	int* ip = &a;         //&ip 
	const int b = 20;     //&b
	const int* bp = &b;   //&bp

2.右值

右值也是一个表示数据的表达式,比如:字面常量、表达式返回值,传值返回函数的返回值(是传值返回,而非传引用返回)右值不能出现在赋值符号的左边且不能取地址

总体而言,不能够取地址的值叫做右值。

    &10;
	&12.23    右值
	&NULL;


  1. &10;&12.23;&NULL;,VS2019 编译报错: “&” 要求左值。原因:右值不能取地址。

3.将亡值 

 将亡值是表达式或函数调用时产生的一个临时量,凡是由内置类型产生的将亡值,它都是一个字面量(只可读不可写),不能够被修改

int main()
{
	int a = 10, b = 20;
	int c = 0;
	c = a + b;//计算值存在 计算结束没了    将亡值
}

 

int Add(int a, int b)
{
	int c = a + b;
	return c;
}

int main()
{
	int x = 0;
	x = Add(12, 23);
}

 

二、左值引用和右值引用 

C++ 语法中就存在引用语法,而 C++11标准中新增了右值引用的语法特性,因此为了区分两者,将C++11标准出现之前的引用称为左值引用。

无论左值引用还是右值引用,都是给对象取别名。

1.左值引用

左值引用就是对左值的引用,给左值取别名

	int a = 10;
	const int b = 20;
	int& ra = a;           //普通引用   
	const int& rca = a;    //常性引用
	const int& rb = b;     //常性引用     

2.右值引用

右值引用就是对右值的引用,给右值取别名。

    //int& rr = 10;
	int&& rr = 10;          //int && right   右值引用

右值引用引用右值,会使右值被存储到特定的位置。
也就是说,右值引用变量其实是左值,可以对它取地址和赋值(const右值引用变量可以取地址但不可以赋值,因为 const 在起作用)。
当然,取地址是指取变量空间的地址(右值是不能取地址的)。 

3.对比与总结

左值引用总结:

  1. 左值引用只能引用左值,不能直接引用右值。
  2. 但是const左值引用既可以引用左值,也可以引用右值。
int main()
{
	int a = 10;
	int& ra = a;
	const int& rca = a;
	//int&& rr = a;          //a是一个左值 右值引用不匹配

	int&& rr = 20;
}
int main()
{
	const int& ra = 10;   //万能引用(不管是左值还是右值都能引用)
	//int tmp=10;
	//const int& ra =tmp;
	//ra += 100;               err

	int&& rr = 10;           //右值引用
	//int tmp=10;                 
	//int &rr=tmp;    


	rr += 100;
   
	int& a = rr;
	//把右值固定到rr上  rr是一个右值引用,
	//右值引用有名字,可以对右值引用取地址(右2名字就能取地址)
	//右值一旦具有名字就变成左值   
	

	//int&& a = rr;           err

}

右值引用总结:

  1. 右值引用只能引用右值,不能直接引用左值。
  2. 但是右值引用可以引用被move的左值。

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

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

相关文章

系统架构设计师之软件概要设计

系统架构设计师之软件概要设计

设计模式(15)组合模式

一、介绍: 1、定义:组合多个对象形成树形结构以表示“整体-部分”的关系的层次结构。组合模式对叶子节点和容器节点的处理具有一致性,又称为整体-部分模式。 2、优缺点: 优点: (1)高层模块调…

国外问卷调查赚钱靠谱吗?

大家好,我是橙河网络,这几年的国外问卷调查项目可真是火得一塌糊涂,不少人靠这个项目赚得是盆满钵满,让人直流口水。今天,我就来给大家详细扒一扒这个国外问卷调查赚钱靠谱吗? 首先,我得跟大家…

家长扫码查成绩

亲爱的老师,你是否曾为了如何让家长更方便地查询学生的成绩而烦恼?现在,我们为你介绍一款简单易用的成绩查询系统,让家长只需轻轻一扫,即可查看孩子的成绩。 一、什么是成绩查询系统? 成绩查询系统是一款专…

TTS | 一文总览语音合成系列基础知识及简要介绍

Text-to-Speech(通常缩写为TTS)是指一种将文本读成音频的技术。换句话说,它指的是一种模型,在该模型中,当文本或类似于字符的东西作为输入时,会生成波形音频作为输出。 但实际上,这个 TTS 的音…

iOS调试技巧——使用Python 自定义LLDB

一、类介绍 在使用Python 自定义LLDB之前,先了解一下LLDB的一些类型 SBTarget 正在被调试的程序SBProcess 和程序关联的具体的进程SBThread 执行的线程SBFrame 和线程关联的一个栈帧SBVariable 变量,寄存器或是一个表达式一般情况下,我们取到SBFrame就可以进行方法调用来打…

Spring Boot整合swagger2

在上一篇中我们围绕了Spring Boot 集成了RESTful API项目,但是我们在实际开发中,我们的一个RESTful API有可能就要服务多个不同的开发人员或者开发团队,包括不限于PC,安卓,IOS,甚至现在的鸿蒙OS,web开发等等…

buuctf_练[网鼎杯 2018]Fakebook

[网鼎杯 2018]Fakebook 文章目录 [网鼎杯 2018]Fakebook掌握知识解题思路关键paylaod 掌握知识 ​ SQL注入的联合注入;闭合类型的探查,本次是数字型闭合;SQL注入的读取文件的利用 解题思路 打开题目链接,发现主界面给了一些信息…

大数据-Storm流式框架(一)

一、storm介绍 Storm是个实时的、分布式以及具备高容错的计算系统 Storm进程常驻内存(worker,supervisor,nimbus,ui,logviewer。。。)Storm数据不经过磁盘,在内存中处理Twitter开源的分布式实时…

CSS基础框盒模型:打造炙手可热的网页布局!

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 ⭐ 专栏简介 📘 文章引言 一、是…

老师们都在用的办公好物

现在还有老师不知道班级查询系统吗?各位老师们,向大家推荐一款超级实用的班级查询系统,帮你轻松管理学生信息,省去繁琐的手动操作,还能让学生们自主查询,简直是老师的福音! 如果你在编程方面感到有些吃力&…

vscode推送gitee方法

有一套uni-app代码需要修改,版本控制使用vscode的git功能,远程库在gitee上。 1、设置vscode中git.exe路径 由于git使用了绿色便携版(PortableGit-2.42.0.2-64-bit.7z.exe),vscode未识别到git安装路径,需要…

RTE2023大会来袭,声网宣布首创广播级4K超高清实时互动体验

10月24日,由声网和RTE开发者社区联合主办的RTE2023第九届实时互联网大会在北京举办,声网与众多RTE领域技术专家、产品精英、创业者、开发者一起,共同开启了以“智能高清”为主题的全新探讨。本届RTE大会将持续2天,开展1场主论坛及…

【路径规划】A*算法 Java实现

A*(A-Star)算法是一种广泛使用的寻路算法,尤其在计算机科学和人工智能领域。 算法思想 通过评估函数来引导搜索过程,从而找到从起始点到目标点的最短路径。评估函数通常包括两部分:一部分是已经走过的实际距离&#x…

「我在淘天做技术」双 11 背后的营销技术体系

作者:朱咏杰(小枫) 近期淘天集团秋季 2024 届校园招聘正式启动,预计将发放 2000 多个 offer,其中技术类岗位占比超过 50%。为了方便大家更真实地了解淘天技术的布局和现状,我们策划了「我在淘天做技术」系列,首次全面分…

科技资讯|苹果穿戴新专利,表带、服装等织物可变身柔性屏幕或扬声器

根据美国商标和专利局(USPTO)本周公示的清单,苹果公司获得了一项新的技术专利,可以在 Apple Watch 表带、服装等物品上,引入基于织物的柔性扬声器。 根据专利描述,通过在织物中嵌入声学组件(例…

Makefile总结

一、Makefile用法及变量(自定义变量、自动变量、隐含变量) 一、Makefile的重要性 1、编译文件 2、正常编译,文件多的时候操作麻烦 3、决定能不能完成大型工程 二、Makefile的概述 1、自动化编译-makefile 编译效率:make编译…

01.MySQL(SQL分类及使用)

注意:DML只是进行增删改,DQL才有查询 分类全称说明DDLData Definition Language数据定义语言,用来定义数据库对象(数据库,表,字段)DMLData Manipulation Language数据操作语言,用来…

vue3的getCurrentInstance获取组件实例踩坑记录

一、getCurrentInstance基本用法 我们可以通过 getCurrentInstance这个函数来返回当前组件的实例对象,也就是当前vue这个实例对象 Vue2中,可以通过this来获取当前组件实例; Vue3中,在setup中无法通过this获取组件实例,console.lo…