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

<五>掌握左值引用和初识右值引用的更多相关文章

  1. [C++11]_[0基础]_[左值引用声明和右值引用声明]

    场景: 在 remove_reference 结构体中能看到右值引用的身影 &&, 那么这里的右值引用究竟有什么用呢? 常常也发现int& 和int&& 这两种 ...

  2. 作业训练------通过读取c.txt文件中的内容等号右值,并将右值的最大值、最小值、平均值打印到屏幕上。

    这篇博客是学习传智播客c++教程的作业,通过在网上进行搜集来完成,但是网上有相似的代码,但是结果总是有点问题,所以本文写了这篇记录下. #include <stdio.h> #includ ...

  3. C++11常用特性介绍——左值引用、右值引用

    一.左值.右值 1)左值:可以放在赋值号左侧.可以被赋值的值:左值必须要在内存中有实体. 2)右值:必须放在赋值号右侧.取出值赋值给其它变量:右值可以在内存中也可以在CPU寄存器中. 二.引用 引用是 ...

  4. c++ 11 移动语义、std::move 左值、右值、将亡值、纯右值、右值引用

    为什么要用移动语义 先看看下面的代码 // rvalue_reference.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #includ ...

  5. C++ 11 左值,右值,左值引用,右值引用,std::move, std::foward

    这篇文章要介绍的内容和标题一致,关于C++ 11中的这几个特性网上介绍的文章很多,看了一些之后想把几个比较关键的点总结记录一下,文章比较长.给出了很多代码示例,都是编译运行测试过的,希望能用这些帮助理 ...

  6. C++11 左值、右值、右值引用详解

    C++11 左值.右值.右值引用详解 左值.右值 在C++11中所有的值必属于左值.右值两者之一,右值又可以细分为纯右值.将亡值. 在C++11中可以取地址的.有名字的就是左值,反之,不能取地址的.没 ...

  7. C++11 左值、右值、右值引用

    左值.右值 在C++11中所有的值必属于左值.右值两者之一,右值又可以细分为纯右值.将亡值.在C++11中可以取地址的.有名字的就是左值,反之,不能取地址的.没有名字的就是右值(将亡值或纯右值).举个 ...

  8. C++ 左值与右值 右值引用 引用折叠 => 完美转发

    左值与右值 什么是左值?什么是右值? 在C++里没有明确定义.看了几个版本,有名字的是左值,没名字的是右值.能被&取地址的是左值,不能被&取地址的是右值.而且左值与右值可以发生转换. ...

  9. [转]C++11 左值、右值、右值引用详解

    https://blog.csdn.net/hyman_yx/article/details/52044632 左值.右值 在C++11中所有的值必属于左值.右值两者之一,右值又可以细分为纯右值.将亡 ...

随机推荐

  1. BZOJ3224/LuoguP3369 普通平衡树 (splay)

    终末のcode #include <iostream> #include <cstdio> #include <cstring> #include <algo ...

  2. openstack 创建虚拟机失败

    虚拟机创建失败    用户创建一台虚拟机,虚拟机使用4个网络平面,所以虚拟机选择了4个不同平面的网络,创建虚拟机一直在孵化的过程中,最后创建虚拟机失败. 失败后返回的报错日志 Build of ins ...

  3. 使用 Less 混合(Mixins)时报语法错误

    今天在尝试使用 less 的混合语法时,浏览器直接报了一个语法错误.下图是报错信息: 仔细地阅读了官方文档,和对比自己写的,并没有任何错误. .FlexLayout { .Start() { disp ...

  4. SSM整合,快速新建javaWeb项目

    整合前需要了解: spring和springmvc包扫描的注意事项 Spring applicationContext.xml (父容器),SpringMVC springmvc-servlet.xm ...

  5. AtCoder Beginner Contest 265(D-E)

    D - Iroha and Haiku (New ABC Edition) 题意: 找一个最少含有三个点的区间,将区间分成三块,三块的和分别为p,q,r,问是否存在这样的区间 题解:先预处理一遍前缀和 ...

  6. 存储更弹性,详解 Fluid “ECI 环境数据访问” 新功能

    近期,Fluid 支持了阿里云 ECI 应用,并将 JuiceFS Runtime Controller 设置为默认安装:JuiceFS 也就此功能与 Fluid 完成了集成和测试工作. 用户可以在 ...

  7. 【必知必会】手把手教你配置MySQL环境变量——图文详解

    一.先决条件 假设我们已经成功安装MySQL数据库.如果还有小伙伴不知道如何安装MySQL数据库,可以在本文下留言,留言数超20,则出一期"手把手教你安装MySQL数据库--图文详解&quo ...

  8. 【pytest官方文档】解读- 如何自定义mark标记,并将测试用例的数据传递给fixture函数

    在之前的分享中,我们知道可以使用yield或者return关键字把fixture函数里的值传递给test函数. 这种方法很实用,比如我在fixture函数里向数据库里插入必要的测试数据,那我就可以把相 ...

  9. G&GH04 本地连接至远程

    注意事项与声明 平台: Windows 10 作者: JamesNULLiu 邮箱: jamesnulliu@outlook.com 博客: https://www.cnblogs.com/james ...

  10. 通过vNode实现给列表字段打标签

    问题 如何给列表数据打标签?类似下面这种样子 思路 数模转化(对接口请求回来的数据进行过滤标记,返回新的数据) 渲染新的数据模型 实现 1.过滤数据,需要打标签的采用jsx写法 业务数据的处理我封装在 ...