首页 > 编程语言 >C++中的左值和右值

C++中的左值和右值

时间:2023-04-05 18:14:26浏览次数:54  
标签:10 const 右值 int 左值 C++ 引用

左值与右值

左值和右值有如下3个规则:

  1. 左值和右值都是表达式。
  2. 左值是对象定位器,理论上左值指示指示一个对象。
  3. 右值是一个临时值,其他位置无法访问这个值,通常情况下在语句执行完成后右值就被丢弃。

http://c.biancheng.net/view/281.html

左值:可以进行取地址的称为左值。

右值:不能进行取地址的称为右值。右值包括:临时对象、匿名对象、临时变量、匿名变量、字面值常量(10)

左值引用

传统的左值引用:

int a = 10;
int &b = a;  // 定义一个左值引用变量
b = 20;      // 通过左值引用修改引用内存的值

左值引用在汇编层面其实和普通的指针是一样的;定义引用变量必须初始化,因为引用其实就是一个别名,需要告诉编译器定义的是谁的引用。

错误的左值引用:

int &val = 10;

10无法进行取地址操作,无法对一个立即数取地址,因为立即数并没有在内存中存储,而是存储在寄存器中,在这一行代码执行完毕后,就被丢弃了,可以通过下述方法(常引用)解决:

const int& val = 10;

// 等价于

const int temp = 10; 
const int &val = temp;

小结:

左值引用要求右边的值必须能够取地址,如果无法取地址,可以用常引用;但使用常引用后,我们只能通过引用来读取数据,无法去修改数据,因为其被const修饰成常量引用了。

由此可知,为什么很多情况下(自定义的拷贝构造函数,运算符重载等场景下)函数的参数需要用const修饰,因为为了增强代码的健壮性。如果不用const修饰,当我们在调用函数时传入一个右值就会出问题,即普通的左值引用无法绑定到右值上,必须使用常左值引用才能绑定右值。

标签:10,const,右值,int,左值,C++,引用
From: https://www.cnblogs.com/MyXjil/p/17290124.html

相关文章

  • C++复习-第一天
    C++支持完全面向对象的程序设计,包括面向对象开发的四大特性:封装;抽象;继承;多态。C++封装 C++抽象 C++继承 C++多态多态的实现方式分为三块:重载,重写,重定义。1.重载是指在同一作用域下,具有相同函数名称不同的参数类型,或不同的参数个数,或不同的返回类型。2.重写是指在......
  • C++库封装JNI接口——实现java调用c++
    1.JNI原理概述通常为了更加灵活高效地实现计算逻辑,我们一般使用C/C++实现,编译为动态库,并为其设置C接口和C++接口。用C++实现的一个库其实是一个或多个类的简单编译链接产物。然后暴露其实现类构造方法和纯虚接口类。这样就可以通过多态调用到库内部的实现类及其成员方法。进一步......
  • 关于我用ai做了一点c++开发这件事
    简介C++一直不是我的主力编程语言,何况众所周知C++学习曲线之陡峭,尽管如此我还是动了挑战一下用ai写一下c++程序的念头,事实证明ai非常高效的帮助我完成了我的目标,在大概7个小时的工作时间里帮助我写完了一个简单的汇编器,我目前主要使用newbing作为ai助手,我们的完整QA如下:QA过程......
  • UE5 修复 C++ 代码里的中文在蓝图中显示为乱码的问题
    1.打开VS2019,依次点击扩展->管理扩展,搜索“UTF8”,安装后源码文件会强制保存为UTF-8。注:可能需要重新保存一下,但是只要保存文件的动作生效就会自动检测-转换编码。 2.使用示例    ......
  • c++实现Matlab矩阵Matrix类(实矩阵Matrix、复矩阵CMatrix)
    全栈工程师开发手册(作者:栾鹏)matlab2c动态链接库下载matlab库函数大全matlab2c基础教程matlab2c开发全解教程开发注意事项:1、目前matlab2c对矩阵的实现仅包含实数型、复数型数据。实数型矩阵使用Matrix定义,复数型矩阵使用CMatrix定义。2、实数矩阵元素int、float元素类型会自动......
  • 8-1 【Python0001】列举说明Python同Java及C++的不同之处
    首先是C++C++是在C语言的基础上发展起来的,他包含了C语言的所有内容。同时,也引入了面向对象的概念。优点:1、他包含了C语言的内容,包括指针,使得C++在执行效率上特别的高效。2、引入面向对象的概念,使得开发效率提高。3、提供了很多的库,具有较好的封装性和移植性(代码)。缺点:1、C++比较难......
  • c++primer 13拷贝控制
               ......
  • C/C++物业费管理系统[2023-04-04]
    C/C++物业费管理系统[2023-04-04]程序设计题:物业费管理系统出题人:俞琼面向专业:软件工程难度等级:41问题描述为维护小区正常的运营管理,居民应按时缴纳小区管理费,请设计一个物业费管理系统,对小区的住户进行收费管理。通过此课题,熟练掌握文件、数组、指针的各种操作,以及一些基......
  • C/C++编译过程
    1.预处理 将.c中的头文件、宏展开生成的文件是.i文件gcc-Ehello.c-ohello.i2.编译将预处理后的.i文件生成.s汇编文件gcc-Shello.i-ohello.s3.汇编将.s文件生成.o目标文件gcc-chello.s-ohello.o4.链接将.o文件链接成可执行文件gcc-chello.o-ohello......
  • 基础C++程序题的基础归纳Ⅲ
    基础C++程序题的基础归纳Ⅲ1、去重排序题目描述ZN想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大......