首页 > 编程语言 >c++ 左值和右值以及左值引用和右值引用

c++ 左值和右值以及左值引用和右值引用

时间:2023-06-03 21:23:31浏览次数:32  
标签:右值 int 绑定 左值 引用 表达式

  • 无法令引用重新绑定到另一个对象上,因此引用必须初始化,引用并非对象,只是为一个已经存在的对象所起的另外一个名字
    • 因为引用本身不是一个对象,所以不能定义引用的引用
int a = 10;
int &b = a;
int &c = b;//此时c不是引用的引用,而是b c 都是a的引用
  • 判断某个表达式是左值还是右值的方法

    • 可以位于赋值号左侧的表达式就是左值;只能位于赋值号右侧的表达式就是右值
    • 有名称的,可以获取到存储地址的表达式为左值,反之为右值
  • 右值引用只能绑定到一个将要销毁的对象,必须进行初始化,只能使用右值来初始化

  • 一般一个左值表达式表示的是一个对象的身份,一个右值表达式表示的是对象的值

int i = 42;
int &r = i;//正确
//    int &&r = i;//错误,不能将一个右值引用绑定到一个左值上
//    int &r2 = i * 42; //错误,i * 42是一个右值
const int &r3 = i * 42; //正确,可以将一个const的引用绑定到一个右值上
int &&r2 = i * 42;//正确

右值引用的使用

  • 和声明左值引用一样,右值引用也必须立即进行初始化操作,而且只能使用右值进行初始化
int &&a = 10;
  • 右值引用可以修改右值
int &&a = 10;
cout<<a<<" "<<&a<<endl;
a = 11;
cout<<a<<" "<<&a<<endl;
  • 存在常量右值引用,但是这种表示没有任何实际用处
    • 右值引用主要用于移动语义和完美转发,前者需要有修改右值的权限
    • 常量右值引用就是引用一个不可修改的右值,可以交给常量左值引用
  • 返回非引用类型的函数,连同算数、关系、位以及后置递增/递减运算符,都生成右值,不能将一个左值引用绑定到这类表达式上,但可以将一个const左值引用或者一个右值引用绑定到这类表达式上
  • 由于右值引用只能绑定到临时对象,可以得知
    • 所引用的对象将要被销毁
    • 该对象没有其他用户
    • 意味着右值引用的代码可以自由地接管所引用的对象的资源

总结

  • 非常量左值引用只可以引用非常量左值,常量左值引用可以引用非常量左值、常量左值以及右值
  • 右值引用不支持引用左值;非常量右值只可以引用非常量右值;常量右值可以引用非常量右值和常量右值

标签:右值,int,绑定,左值,引用,表达式
From: https://www.cnblogs.com/sunjianzhao/p/17454660.html

相关文章

  • 6.2 数组引用传递分析
    数组是引用传递publicclassHelloWorld{publicstaticvoidmain(String[]args){//数组是引用数据类型;就一定会发生引用传递;intdata[]=newint[]{10,20,30};inttemp[]=data;temp[0]=99;//data[0]会跟着改变;......
  • 函数返回值与指向对象的指针和引用
    定义一个指向对象的指针或则引用不会调用构造函数和析构函数。首先,强调一点,和函数传参一样,函数返回时也会做一个拷贝。从某种角度上看,和传参一样,也分为三种:(1)返回值:返回任意类型的数据类型,会将返回数据做一个拷贝(副本)赋值给变量(return语句后边的变量会生成一个副本给一个临......
  • C++面试八股文:C++中指针、引用、解引用和取地址有什么不同?
    某日小二参加XXX科技公司的C++工程师开发岗位2面:面试官:指针、引用、解引用和取地址是C++中的重要概念,请问它们在语法和语义上有所不同?小二:指针是一个变量,它存储了一个内存地址。小二:引用是一个别名,它允许使用一个变量的多个名称来访问同一个内存位置。小二:解引用是指使用*运......
  • 集合引用类型
    一、集合引用类型对象数组与定兴数组Map、WeakMap、Set、WeakSet类型1.1Object显示创建Object:1、两种方式new操作符和Object构造函数letperson=newObject();person.name="Nicholas";person.age=18;2、使用对象字面量letperson={name:"Nicho......
  • C++中分别使用左值形参和右值形参的拷贝构造和移动构造
    #include<iostream>classData{public:Data(){std::cout<<"EMPTY."<<std::endl;}Data(constData&d){std::cout<<"lvaluecopy."<<std::endl;}Data(constData&&d){std::cout......
  • JDK 8 新特性:构造器引用(了解)
       ......
  • JDK 8 新特性:方法引用:静态方法和实例方法
         ......
  • JDK 8 新特性:特定类型方法的引用
         ......
  • 引用
    引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。引用的特性:1.在定义时必须初始化,之后不可更改。2.引用不可以为NULL。3.一个变量可以有多个引用。引用的使用:格式如下:类型&引用变量名=引用实体;......
  • 为什么 C++ 有指针了还要引用
    引用传递,只是明面上,没有使用值传递,值传递本身是不可避免的。编译器,暗地里通过指针(或者其他可以替代指针的数据类型)的值传递,替换了引用传递。所以引用传递,实质上是地址传递,别名这东西只是概念,是一种抽象,别名是没法传递的。别名,可不是真实的数据类型。因为,函数传递参数需要,数据复制,......