C++ 左值和右值 的学习

  • 引用是一个变量,它引用其他变量的内存位置
int x = 34;
int &lRef = x;
  • 标识符 IRef 就是一个引用。在声明中,引用是通过 & 来指示的,出现在类型与变量的标识符之间,这种类型的引用称为左值引用
  • 左值看作是一个关联了名称的内存位置,允许程序的其他部分来访问它, "名称" 解释为任何可用于访问内存位置的表达式
  • 右值则是一个临时值,它不能被程序的其他部分访问
int square(int a)
{return a * a;
}
int main()
{int x = 0; // 1x = 12; // 2cout << x << endl; // 3x = square(5); // 4cout << x << endl; // 5return 0;
}
  • x 是一个左值,这是因为 x 代表一个内存位置,它可以被程序的其他部分访问,例如上面注释的第 2、3、4 和 5 行
  • 表达式 square(5) 却是一个右值,因为它代表了一个由编译器创建的临时内存位置,以保存由函数返回的值。该内存位置仅被访问一次,也就是在第 4 行赋值语句的右侧。在此之后,它就会立即被删除,再也不能被访问了。对于包含右值的内存位置来说,其本质就是:它虽然没有名称,但是可以从程序的其他部分访问到它
  • C++11 引入了右值引用的概念,以表示一个本应没有名称的临时对象。右值引用的声明与左值引用类似,但是它使用的是 2 个 & 符号(&&)
int && rRef = square(5);
cout << rRef << endl;
  • 声明一个右值引用,给一个临时内存位置分配一个名称,这使得程序的其他部分访问该内存位置成为了可能,并且可以将这个临时位置变成一个左值。
  • 右值引用不能约束到左值上,所以,以下代码将无法编译:
int x = 0;
int && rRefX = x;
  • 初始化完成之后,这个包含值 square(5) 的内存位置有了一个名称,即 rRef1,所以 rRef1 本身变成了一个左值。这意味着后面的这个初始化语句将不会编译:int && rRef2 = rRef1;究其原因,就是右侧的 rRef1 不再是一个右值。综上所述,临时对象最多可以有一个左值引用指向它。如果函数有一个临时对象的左值引用,则可以确认,程序的其他部分都不能访问相同的对象
int && rRef1 = square(5);
  • 右值一般是不可寻址的常量,或在表达式求值过程中创建的无名临时对象,短暂性的。
  • 左值是可寻址的变量,有持久性;
  • 左值和右值主要的区别之一是左值可以被修改,而右值不能。
  • 左值引用:引用一个对象;
  • 右值引用:就是必须绑定到右值的引用,C++11中右值引用可以实现“移动语义”,通过 && 获得右值引用。
  • 右值引用和相关的移动语义是C++11标准中引入的最强大的特性之一,通过std::move()可以避免无谓的复制,提高程序性能。

特殊情况

  • 但const左值引用除外,由于const的不可变性,所以const引用可以指向右值,我们经常使用const引用作为函数参数传递    const int &e = a*3; // 正确:左值引用,const引用可以绑定到一个右值上

例子

int x = 6; // x是左值,6是右值
int &y = x; // 左值引用,y引用xint &z1 = x * 6; // 错误,x*6是一个右值
const int &z2 =  x * 6; // 正确,可以将一个const引用绑定到一个右值int &&z3 = x * 6; // 正确,右值引用
int &&z4 = x; // 错误,x是一个左值

参考链接

  • C++左值和右值(详解版)
  • 一篇文章弄懂C++左值引用和右值引用 - html中文网

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

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

相关文章

百度关键词排名查询源码_章丘百度霸屏总部,关键词排名腾沃云

上海保沃腾沃云为您详细解读URiIr章丘百度霸屏总部的相关知识与详情&#xff0c;做网站SEO优化文章内容优化效果已经十分明显。内容的量量关于网站的整体量量很重要。通过关键字阐发&#xff0c;陈某们晓得需要环绕关键字编写网页。使您的内容的重要根底是您对网页筹算描述的卖…

java 结婚问题

题目 大家都知道&#xff0c;男大当婚&#xff0c;女大当嫁。那么女方家长要嫁女儿&#xff0c;当然要提出 一定的条件&#xff1a;高&#xff1a;180cm以上&#xff1b;富&#xff1a;财富1千万以上&#xff1b;帅&#xff1a;是。 如果这三个条件同时满足&#xff0c;则&…

密码学专题 数据填充的方式|序列加密的方式

电子密码本模式和加密分组链接模式的分组算法都要求加密输入的分组是固定长度 的&#xff0c;但是大多数输入明文可能都不是分组长度的整数倍&#xff0c;也就是说&#xff0c;最后一个分组一般来 说是不足一个分组长度的。为了使分组加密算法能够正常工作&#xff0c;通常使用…

win10此电脑不见了_教程 | win10总提示“你要允许此应用对电脑的修改吗”,如何关闭?...

在使用电脑的时候&#xff0c;你是否曾遇到过这样的情况&#xff0c;点击打开软件的时候&#xff0c;系统总是提示我们“你要允许此应用对你的设备进行修改吗&#xff1f;”难道是软件中病毒了吗&#xff1f;&#xff0c;这其实上并没有什么用处&#xff0c;只是系统无法判断软…

java 小时转换为xx天xx小时

题目 为抵抗洪水&#xff0c;战士连续作战89小时&#xff0c;编程计算共多少天零多少小时&#xff1f; 代码 使用/与% class ExchangeTime {public static void main(String[] args) {/*为抵抗洪水&#xff0c;战士连续作战89小时&#xff0c;编程计算共多少天零多少小时&a…

密码学专题 加密模式的选择|传输数据加密

分组加密模式和序列加密模式。它们之间最大的区 别在于分组加密模式每次对一组数据进行加密运算处理&#xff0c;而序列加密模式则逐位对数据进 行加密运算处理。事实上&#xff0c;在实际设计应用的算法中&#xff0c;并没有那么严格的区别&#xff0c;它们有可能是相互结合的…

微信公众号数据2019_2019年9月原创公众号排行榜数据报告出炉

西瓜数据发布 2019 年 9 月原创公众号排行榜&#xff0c;分别从西瓜指数、原创文章占比、周期内公众号发文次数、发文篇数、总阅读数、头条平均阅读数等方面展示公众号数据。榜单说明1、涉及榜单本期月榜截取 ①财经、②教育、③娱乐、④科技、⑤体育、⑥游戏、⑦文化、⑧美食、…

java 求100天之后是周几

题目 今天是周二&#xff0c;100天以后是周几&#xff1f; 代码 代码1&#xff1a;减去天数&#xff0c;使循环从周一开始 //方法1&#xff1a;减去天数&#xff0c;使循环从周一开始int today2;//7天一个循环&#xff1a;3 4 5 6 7 1 2 3 4 5 6 7int after100;//(100-5)%…

密码学专题 OpenSSL专题

OpenSSL总体架构 软件包分为三个主要的功能部分&#xff1a;密码算法库 、 SSL协议库及应用程序 MacOS&#xff0c;MS&#xff0c;OS/2及 VMS这几个目录&#xff0c;包含了在不同的 平台编译时的环境变量配置文件&#xff0c;在安装编译完成之后&#xff0c;这几个目录就没有作…

java 华氏温度转换为摄氏温度

题目 小明要到美国旅游&#xff0c;可是那里的温度是以华氏度为单位记录的。 它需要一个程序将华氏温度&#xff08;80度&#xff09;转换为摄氏度&#xff0c;并以华氏度和摄氏度为单位分别显示该温度。 公式&#xff1a;华氏温度&#xff08;摄氏温度-32&#xff09;/1.8 M…

hs控什么意思_凡尔赛文学 到底是什么?

点击蓝字关注我们XIE XIE NI DE XI HUAN|| 动漫 情头 耽美 闺蜜 男女头 句子控 壁纸 ||左句 凡尔赛文学野象&#xff1a;老是有人提知不知道凡尔赛文学&#xff0c;说实话我不太清楚网络时下流行的梗&#xff0c;也没有兴趣参与&#xff0c;我还是比较喜欢欧洲古典文学和后现…

密码学专题 openssl编译和安装

Configure 脚本文件 使得OpenSSL可以适应多种不同的系统平台和多达几十种不同的编译器。Configure指令还可以使OpenSSL在编译的时候具备组件的选择功能&#xff0c;比如可以选择支持或者不支持某种算法或者协议等&#xff0c;这使得OpenSSL具有很大的灵活性&#xff0c;比如在…

Python学习12 文件的读写

目标 文件的打开和关闭 mode缺省情况下表示只读r 文件的路径 前面加个r’,代表其中的转义字符不起作用 文件的打开方式 案例&#xff1a;实现文件拷贝的功能 将某一文件夹下的某一文件 保存在当前文件 所在目录。 import os #读取文件1 path./file.txt fileopen(path,…

密码学专题 openssl的基本概念

配置文件 配置文件是OpenSSL的一个基础结构组件&#xff0c;OpenSSL使用一组称为OpenSSLCONF的函数来读取OpenSSL配置文件的信息。OpenSSL提供的主配置文件是opensl.cnf&#xff0c;它集成了OpenSSL所要使用的配置文件选项的大部分内容。此外&#xff0c;OpenSSL还提供了其他一…

该工程中的宏被禁止_建筑劳务分包都能承担什么工程

来源&#xff1a;找法网建筑工程的承包单位&#xff0c;也就是总承包单位可以将部分建造工程分包给具有资质的施工单位&#xff0c;这是法律所允许的&#xff0c;但是禁止将建造工程进行转包。一、建筑劳务分包都能承担什么工程建筑劳务分包能承担什么工程要看分包单位的资质&a…

python实验练习-类的多继承

题目 1、概述&#xff1a; 完成学生&#xff0c;组长&#xff0c;教师的设计与实现。 2、具体实现内容&#xff1a; 学生&#xff1a; 姓名&#xff0c; 年龄&#xff0c; 学号 吃饭&#xff0c; 睡觉&#xff0c; 学习 组长&#xff1a; 姓名&#xff0c; 年龄&#xff0c; 学…

matlab用辛普森公式求积分_积分近似计算之辛普森公式

对于积分区间[a, b]&#xff0c;若则成立辛普森公式辛普森公式可看作是改良的梯形公式。梯形公式是以直线逼近实际曲线&#xff0c;而辛普森公式则以二次曲线(即抛物线)逼近。以二次曲线逼近实际曲线根据辛普森公式可得各积分小区间内的积分值如下式所示&#xff1a;其中于是&a…

密码学专题 文件编码格式

OpenSSL中虽然使用PEM作为基本的文件编码格式&#xff0c;但是&#xff0c;由于不同的对象其封装的标准格式不太一样&#xff0c;所以经常会导致读者产生迷惑。此外&#xff0c;OpenSSL也支持DER编码和过时的Netscape编码格式(NET)OpenSSL的编码是基于ASN.1标准的&#xff0c;A…

python实验练习-图书管理系统(使用文件来实现)

题目 功能描述&#xff1a; 图书管理系统项目功能描述&#xff1a; &#xff08;1&#xff09;创建txt文本文档&#xff0c;包含如下&#xff1a; ① books.txt&#xff1a;保存有一些书籍名称&#xff1b; ② users.txt&#xff1a;用于保存用户相关的信息&#xff1b; ③ us…

echarts 折线图 设置y轴最小刻度_【硬货】vue全家桶+Echarts+百度地图,搭建数据可视化系统...

作者丨夙言来源丨前端大牛爱好者(Web-2017)https://segmentfault.com/a/1190000018993981本文章篇幅略长&#xff0c;内容有点多&#xff0c;大佬可根据目录选择性查阅&#xff0c;新人可一步步来阅读。1、 前言1.1 业务场景突然接到产品说要做一个数据监控的系统。有线图、柱状…