【C++11特性篇】一文助小白轻松理解 C++中的【左值&左值引用】【右值&右值引用】

前言

大家好吖,欢迎来到 YY 滴C++系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁
主要内容含:
在这里插入图片描述

欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!

目录

  • 一.【左值&左值引用】&【右值&右值引用】
    • 【1】左值&左值引用
      • 左值:
      • 左值引用:
    • 【2】右值&右值引用
      • 右值:
      • 普通右值&将亡值:
      • 右值引用:
  • 二.左值引用右值&右值引用左值の规则
    • 基本规则:
    • 左值引用右值&右值引用左值の总结:
  • 三.move函数
  • 三.探究【右值引用(移动拷贝)是如何大大提高效率?——对比拷贝构造&左值引用】

一.【左值&左值引用】&【右值&右值引用】

【1】左值&左值引用

左值:

  • 左值是一个表示数据的表达式
  • 如: 变量名或解引用的指针
  • 出现位置:左值 可以出现在赋值符号的左边,右边
  • 性质1:左值可以 取地址+可以对它赋值
  • 性质2: 定义时const修饰符后的左值 不可以对它赋值 ,但是 可以对它取地址
    在这里插入图片描述

左值引用:

  • 左值引用就是给左值的引用,给左值取别名
  • int a = 0; int& r1 = a;
  • 代码演示如下:
int main()
{// 以下的ptr、b、c、*p,都是左值int* ptr = new int(0);int b = 1;const int c = 2;"xxxxx";const char* p = "xxxxx";//左值可以取地址cout << &("xxxxx") << endl;//左值引用演示int a = 0;int& r1 = a;
}

【2】右值&右值引用

右值:

  • 右值也是一个表示数据的表达式
  • 如: 字面常量、表达式返回值,函数返回值(这个不能是左值引用返回)等等、
  • 出现位置: 右值可以出现在赋值符号的右边, 但是不能出现出现在赋值符号的左边
    在这里插入图片描述
  • 性质: 右值不能取地址

普通右值&将亡值:

我们一般把右值分为如下两类:

  1. 普通右值
  2. 将亡值,例如:fun( )
    在这里插入图片描述

右值引用:

  • 右值引用就是对右值的引用,给右值取别名
  • 例如:int&& r5 = 10;
  • 代码演示如下:
int main()
{//以下均为右值10;x + y;fmin(x, y);//右值无法取地址// cout << &10 << endl;// cout << &(x+y)<< endl;// cout << &(fmin(x, y)) << endl;// 以下几个都是对右值的右值引用int&& rr1 = 10;double&& rr2 = x + y;double&& rr3 = fmin(x, y);
}

二.左值引用右值&右值引用左值の规则

基本规则:

  • 引用是 取别名
  • 左值引用:给左值取别名————————(1)正常左值引用(2)带const的左值引用
    在这里插入图片描述
  • 右值引用:给右值取别名
  • move( )可以让里面的值具有 右值性质

左值引用右值&右值引用左值の总结:

在这里插入图片描述

int main()
{double x = 1.1, y = 2.2;// 左值引用:给左值取别名int a = 0;int& r1 = a;// 左值引用能否给右值取别名?// const左值引用可以const int& r2 = 10;const double& r3 = x + y;// 右值引用:给右值取别名int&& r5 = 10;double&& r6 = x + y;// 右值引用能否给左值取别名?// 右值引用可以引用move以后的左值int&& r7 = move(a);return 0;
}

三.move函数

引入:按照语法,右值引用只能引用右值,但右值引用一定不能引用左值吗?

  • 因为:有些场景下,可能真的需要用右值去引用左值实现移动语义。当需要用右值引用引用一个左值时,可以通过move函数将左值转化为右值。
  • C++11中,std::move()函数位于 头文件中,该函数名字具有迷惑性,它并不搬移任何东西,唯一的功能就是将一个左值强制转化为右值引用,然后实现移动语义。
int main()
{bit::string s1("hello world");// 这里s1是左值,调用的是拷贝构造bit::string s2(s1);// 这里我们把s1 move处理以后, 会被当成右值,调用移动构造// 但是这里要注意,一般是不要这样用的,因为我们会发现s1的// 资源被转移给了s3,s1被置空了。bit::string s3(std::move(s1));return 0;
}
  • 为什么s1会置空呢?让我们看看接下来一篇博客:

三.探究【右值引用(移动拷贝)是如何大大提高效率?——对比拷贝构造&左值引用】

  • 博客传送门

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/282492.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MNIST内置手写数字数据集的实现

torchvision库 torchivision库是PyTorch中用来处理图像和视频的一个辅助库&#xff0c;接下来我们就会使用torchvision库加载内置的数据集进行分类模型的演示 为了统一数据加载和处理代码&#xff0c;PyTorch提供了两个类用于处理数据加载&#xff0c;他们分别是torch.utils.…

【基础算法】试除法判定质数(优化)

文章目录 算法优化模板题目代码实现 算法优化模板 bool is_prime(int n){if(n < 2) return false;for(int i 2;i < n / i;i ){ //优化内容if(n % i 0){return false;}}return true; }注意这里的一个总要优化是for循环的终止条件是i<n/i。为什么不是i<n或者i<…

【ArkTS】如何修改应用的首页

之前看到一种说法&#xff0c;说是应用首页是 entry > src > main > resources > base > profile > main_pages.json 中src配置中数组第一个路径元素。这种说法是不对的&#xff01;&#xff01;&#xff01; 如果需要修改应用加载时的首页&#xff0c;需要…

二叉树前,中序推后续_中,后续推前序

文章目录 介绍思路例子 介绍 二叉树是由根、左子树、右子树三部分组成。 二叉树的遍历方式又可以分为前序遍历&#xff0c;中序遍历&#xff0c;后序遍历。 前序遍历&#xff1a;根&#xff0c;左子树&#xff0c;右子树 中序遍历&#xff1a;左子树&#xff0c;根&#xff0…

python学习1补充

大家好&#xff0c;这里是七七&#xff0c;这个专栏是用代码实例来学习的&#xff0c;不是去介绍很多知识的。 话不多说&#xff0c;开始今天的内容 目录 代码1 代码2 代码3 代码4 代码5 学习1的总代码 代码1 groupeddf.groupby(单品编码) result{} groupeddf.groupb…

配置 vim 默认显示行号 行数 :set number

vi ~/.vimrc 最后添加一行 :set number保存退出&#xff0c;再次 vim 打开文件&#xff0c;默认就会显示行号了

Python-折线图可视化

折线图可视化 1.JSON数据格式2.pyecharts模块介绍3.pyecharts快速入门4.创建折线图 1.JSON数据格式 1.1什么是JSON JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据JSON本质上是一个带有特定格式的字符串 1.2主要功能json就是一种在各个编程语言中流…

网络监控软件提高企业网络效率

企业网络监控是主动监控和管理业务网络以确保无缝性能并提高可靠性的做法&#xff0c;持续监控和分析网络各层的可用性、运行状况和性能&#xff0c;但是&#xff0c;选择的网络监控软件应该能够满足业务需求。不是所有的网络监控工具都能用于监控企业网络&#xff0c;它们无法…

DENet:用于可见水印去除的Disentangled Embedding网络笔记

1 Title DENet: Disentangled Embedding Network for Visible Watermark Removal&#xff08;Ruizhou Sun、Yukun Su、Qingyao Wu&#xff09;[AAAI2023 Oral] 2 Conclusion This paper propose a novel contrastive learning mechanism to disentangle the high-level embedd…

【基础算法】前缀和

文章目录 算法介绍什么是前缀和&#xff1f;&#xff1f;前缀和的作用一维数组求解前缀和(Si)二维数组求解前缀项和 示例题目1&#xff1a;acwing795示例题目2&#xff1a;acwing796总结收获 算法介绍 什么是前缀和&#xff1f;&#xff1f; 数组: a[1], a[2], a[3], a[4], a[…

WPF——命令commond的实现方法

命令commond的实现方法 属性通知的方式 鼠标监听绑定事件 行为&#xff1a;可以传递界面控件的参数 第一种&#xff1a; 第二种&#xff1a; 附加属性 propa&#xff1a;附加属性快捷方式

加密的艺术:对称加密的奇妙之处(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…