<五>掌握左值引用和初识右值引用
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中所有的值必属于左值.右值两者之一,右值又可以细分为纯右值.将亡 ...
随机推荐
- CSS 选择器(一):属性选择器
属性选择器的介绍 属性选择器顾名思义就是通过标签的属性来查找标签的选择器.让我们来回忆一下标签的属性是什么?HTML5 的所有标签共同拥有的属性叫作全局属性,除此之外还有标签自己拥有的属性,就叫作私有 ...
- [CSharpTips]判断两条线段是否相交
判断两条线段是否相交 主要用到了通过向量积的正负判断两个向量位置关系 向量a×向量b(×为向量叉乘),若结果小于0,表示向量b在向量a的顺时针方向:若结果大于0,表示向量b在向量a的逆时针方向:若等于 ...
- jbd2的死锁分析
已经运行多年的jbd2,它还是死锁了 背景:这个是在centos7的环境上复现的,内核版本为3.10.0-957.27.2.el7 下面列一下我们是怎么排查并解这个问题的. 一.故障现象 oppo云内 ...
- 深入解析Flutter下一代渲染引擎Impeller
作者 魏国梁:字节 Flutter Infra 工程师, Flutter Member,长期专注 Flutter 引擎技术 袁 欣:字节 Flutter Infra 工程师, 长期关注渲染技术发 ...
- linux --stdin 管道 标准输入重定向
linux --stdin 标准输入重定向 --stdin This option is used to indicate that passwd should read the new passwo ...
- 做自动化测试选择Python还是Java?
你好,我是测试蔡坨坨. 今天,我们来聊一聊测试人员想要进阶,想要做自动化测试,甚至测试开发,如何选择编程语言. 前言 自动化测试,这几年行业内的热词,也是测试人员进阶的必备技能,更是软件测试未来发展的 ...
- 在hyper-v虚拟机中安装并配置linux
虽然都是自己写的,还是贴个原文链接吧,如果文章里的图片错乱了,可能就是我贴错了,去看原文吧. 多图警告 WSL2真香? WSL2相比于WSL1前者更类似于虚拟机,配合上Windoes Terminal ...
- 如何用 refcursor 返回结果集
可以通过返回 Refcursor 类型的函数,或者out 类型的函数或 procedure 返回结果集. 一.返回refcursor 类型的函数 create or replace function ...
- KingbaseFlySync 评估工具的使用
关键字: KingbaseFlySync.Linux.x86_64.mips64el.aarch64.Java **** 评估工具的使用**** 1.查询评估工具所在服务器的硬件平台(x86_64.m ...
- spark 读取hive 计算后写入hive
package com.grady import org.apache.spark.SparkConf import org.apache.spark.sql.{DataFrame, Row, Spa ...