首页 > 其他分享 ><五>掌握左值引用和初识右值引用

<五>掌握左值引用和初识右值引用

时间:2022-10-28 22:23:43浏览次数:54  
标签:20 右值 int 左值 引用 指针

1:C++的引用,引用和指针的区别?
1:从汇编指令角度上看,引用和指针没有区别,引用也是通过地址指针的方式访问指向的内存
int &b=a ; 是需要将a的内存地址取出并存下来, b=20;(通过引用修改值时,也是先取出指向的地址,然后访问该地址的值并修改它,和通过指针修改值一样)
在定义引用的时候,必须初始化,并能够对a取地址。所以 int &c=20 编译错误的,因为20取不了地址.
2:引用只有一级引用没有多级引用,指针有一级指针和多级指针
3:定义一个引用变量和定义一个指针变量,其汇编指令是一样的.通过引用变量修改所引用内存的值和通过指针修改所指向内存的值其底层指令也是一样的.
4:
int array[5]={};
int *p=array;
cout<<sizeof(array)<<endl; //20
cout<<sizeof(p)<<endl; //4


2:怎么定义一个引用变量
第1步:先对要引用的变量 取地址即&, &a ,然后定义一个指针来接, 所以就变成了 int *p=&a;
第2步: 用&符号取代 * ,所以变成了 int &p=a;

那么又怎么定义一个引用变量来引用一个数组呢?
第1步: 对数组名取地址 &array, 对数组取地址要怎么接能? int (*p)[5]=&array;
第2步:用& 取代 *, 所以就变成了 int (&p)[5]=array;
如果打印 sizeof(p) ,值也是20,就是数组的大小.


3:引用有什么好处?
void swap(int a, int b){
int c=a;
a=b;
b=c;
}
上面的代码是实现不了值交换的,需改为如下方式
void swap(int *a ,int b){
int c =
a;
a =b;
*b=c;
}
另外一种方式,通过引用
void swap(int &a,int &b){
int c=a;
a=b;
b=c;
}
上面通过引用的方式整体在使用上更简洁更自然.其实引用的方式在底层指令实现上,仍然是通过传递地址,
只是编译器帮我们在后台做了很多转换的工作.


4:关于左值引用和右值引用
左值: 它有内存,有名字,值可以修改
例如 int a=10;
就可以定义引用 int &b=a;

但是 int &c=20;//不可以 20内有内存,无法取值,20 是右值
右值:没有内存,没名字

C++11 以后,提供了右值引用 如下
int &&m=20;
也还可以 m =30;
上面代码底层汇编的实现方式,其实是将20存储在栈内存中的一个临时量上,然后把临时量的内存地址给 m

int &&m=20;//通过右值引用来引用右值

那么
int a=10;
int &b =a;

int &&c=20
左值引用和右值引用在汇编指令上的实现是怎么样的?

一个右值引用变量本事是一个左值,这个右值引用本身也是有名字,也占存储空间,也是可以取地址的,而且只能用左值引用变量来引用它,如下,
int &&m=20;
int &n=m;

不能用一个右值引用变量来引用一个左值,如下
int c=100;
int &&m=c;
上面编译报错,右值引用,编译器是要为右边的值生产临时量的, c已经有内存空间了,还需要为他生成临时量做啥呢?所以右值引用只能专门用来引用右值的,
指令上是通过产生临时量的方式实现的.


5:为什么 const int &m =20 可以通过编译?
实现方式是
int temp=20;
int &m =temp;
编译器定义了一个临时量,只是不可以 m=100; 因为 m 是const

标签:20,右值,int,左值,引用,指针
From: https://www.cnblogs.com/erichome/p/16837004.html

相关文章

  • 左值与右值
      寄存器存储在CPU中  例子:  转为汇编语言:  为什么不能写a+b=c;a+b的结果送入了寄存器,它没有确定的位置,所以不能更改。而intc=a+b;c有固定的内......
  • 关于值传递,地址传递,引用传递
    引用传递是我就是你,我在函数给你另外取了一个名字而已指针传递类似复制一份地址,告诉我的指向在哪,我的空间传递给你我们一起来共享 ......
  • javaSE06基础-对象与引用-基本类型和引用类型的区别
    面向对象2对象与引用引用对象:Java语言中除基本数据类型之外的变量类型都称为引用类型.java中的对象是通过引用对其操作的例如:我们有一个自定义类为Car(汽车类)classCar{S......
  • Java - Java 中的四种引用
    强引用Objecto=newObject();只要强引用还存在,垃圾回收器就永远不会回收掉该对象。软引用描述有用但是非必需的对象,使用softReference类来实现是否回收对象取决于J......
  • 解决升级 Spring Boot 2.6后,因循环引用导致启动时报错的问题
    1.错误提示  2.错误原因  3.错误解决3.1可以通过在配置文件中配置如下属性以恢复正常application.properties配置方式  yaml格......
  • C++八股文——引用与指针的区别
    本质引用是别名,指针是地址具体分析从现象上:指针运行的时候可以改变其所指向的值,而引用一旦和某个对象绑定之后就不再改变。指针可以重新被赋值以指向另外一个不同的对象......
  • 如何引用uni-app组件
    目的:找一个这样的卡片组件显示数据 在Dcloud里找到这样的插件并且引入    根据下方的说明来使用一、引入组件在右上方点击引入HbuilderX后,在需要应用的......
  • 收集牛客网腾讯面试查漏补缺【threadlocal、explain、引用】
    一、ThreadLocal【解决共享变量】1.ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量......
  • new4j索引用法
    最新需要实现索引相关的功能,需要调研其它数据索引的实现和应用,今天主要是翻了new4j的一个index用户使用手册。今天的主题,主要是把相关的资料连接甩出来,至于实际的实现和索......
  • C语言 外部函数引用
    //!!!!!!!!!!!数组在main函数传参的时候外函数是不能单单用sizeof(a)/sizeof(a[0])来求数组大小的!!!!!!// 应该在main()函数里面求出数组大小再用传到外部函数当中!!!!!!//一般把函数的声......