<五>掌握左值引用和初识右值引用
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
<五>掌握左值引用和初识右值引用的更多相关文章
- [C++11]_[0基础]_[左值引用声明和右值引用声明]
场景: 在 remove_reference 结构体中能看到右值引用的身影 &&, 那么这里的右值引用究竟有什么用呢? 常常也发现int& 和int&& 这两种 ...
- 作业训练------通过读取c.txt文件中的内容等号右值,并将右值的最大值、最小值、平均值打印到屏幕上。
这篇博客是学习传智播客c++教程的作业,通过在网上进行搜集来完成,但是网上有相似的代码,但是结果总是有点问题,所以本文写了这篇记录下. #include <stdio.h> #includ ...
- C++11常用特性介绍——左值引用、右值引用
一.左值.右值 1)左值:可以放在赋值号左侧.可以被赋值的值:左值必须要在内存中有实体. 2)右值:必须放在赋值号右侧.取出值赋值给其它变量:右值可以在内存中也可以在CPU寄存器中. 二.引用 引用是 ...
- c++ 11 移动语义、std::move 左值、右值、将亡值、纯右值、右值引用
为什么要用移动语义 先看看下面的代码 // rvalue_reference.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #includ ...
- C++ 11 左值,右值,左值引用,右值引用,std::move, std::foward
这篇文章要介绍的内容和标题一致,关于C++ 11中的这几个特性网上介绍的文章很多,看了一些之后想把几个比较关键的点总结记录一下,文章比较长.给出了很多代码示例,都是编译运行测试过的,希望能用这些帮助理 ...
- C++11 左值、右值、右值引用详解
C++11 左值.右值.右值引用详解 左值.右值 在C++11中所有的值必属于左值.右值两者之一,右值又可以细分为纯右值.将亡值. 在C++11中可以取地址的.有名字的就是左值,反之,不能取地址的.没 ...
- C++11 左值、右值、右值引用
左值.右值 在C++11中所有的值必属于左值.右值两者之一,右值又可以细分为纯右值.将亡值.在C++11中可以取地址的.有名字的就是左值,反之,不能取地址的.没有名字的就是右值(将亡值或纯右值).举个 ...
- C++ 左值与右值 右值引用 引用折叠 => 完美转发
左值与右值 什么是左值?什么是右值? 在C++里没有明确定义.看了几个版本,有名字的是左值,没名字的是右值.能被&取地址的是左值,不能被&取地址的是右值.而且左值与右值可以发生转换. ...
- [转]C++11 左值、右值、右值引用详解
https://blog.csdn.net/hyman_yx/article/details/52044632 左值.右值 在C++11中所有的值必属于左值.右值两者之一,右值又可以细分为纯右值.将亡 ...
随机推荐
- Luogu[YNOI2019]排序(DP,线段树)
要最优?就要一步到位,不能做"马后炮",走"回头路",因此将序列映射到一个假定最优序列,发现移动原序列等价于删除原序列元素,以便生成最大不下降子序列.可线段树维 ...
- CF10D LCIS(线性DP)
题意:\(LCIS\)输出方案 变迁の时刻,标记它 P.S:特判没\(LCIS\)的情况 //#include <iostream> #include <cstdio> #in ...
- 客户流失?来看看大厂如何基于spark+机器学习构建千万数据规模上的用户留存模型 ⛵
作者:韩信子@ShowMeAI 大数据技术 ◉ 技能提升系列:https://www.showmeai.tech/tutorials/84 行业名企应用系列:https://www.showmeai. ...
- Java-往数据库插入日期
Java-往数据库中插入日期 将字符串类型的时间转换成mysql的日期格式 String str = "2022-6-11"; SimpleDateFormat sdf = new ...
- Linux安装Jenkins及配置svn使用
目录 1. 下载 2. 创建文件夹 3. 安装 4. 修改端口,不用这步 5. 安装插件提速 6. 启动 7. 页面访问 8. 新建用户 9. 安装Subversion插件 10. 安装maven插件 ...
- VS Code中Markdown常用插件
目录 目录 1.Markdown All in One 2.Markdown Preview Enhanced 3.markdownlint 1.Markdown All in One 自动生成目录 ...
- 富莱尔ERP
微型版本 按年付费模式 980包含5个用户,后续每增加一个用户加298元. 适合创业型企业,想尝试用下ERP软件解决打送货单问题,客户自动生成账单,自动统计业务员每月业绩功能. 试用账号:wxadmi ...
- SpringBoot整合JWT实现登录认证
什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点 ...
- TFT-eSPI入门使用教程
一.准备资料 开发板:ESP32-S3 屏驱动是:ST7789_DRIVER 开发环境:VS Code + PlatformIO 注意:以上是我使用的环境,不一定需要和是使用的东西一样,这里主要是学习 ...
- this的指向问题、bind/call/apply改变this指向
this的指向问题 全局作用域下的this指向 无论是否是严格模式,全局作用域下的this始终指向window 函数内部的this 严格模式下: function test() { 'use stri ...