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

前言

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

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

目录

  • 一.【左值&左值引用】&【右值&右值引用】
    • 【1】左值&左值引用
    • 【2】右值&右值引用
  • 二.左值引用右值&右值引用左值の规则
  • 三.弥补左值引用缺陷——探究【右值引用(移动拷贝)是如何大大提高效率?】

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

【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;
}

三.弥补左值引用缺陷——探究【右值引用(移动拷贝)是如何大大提高效率?】

  • 博客传送门

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

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

相关文章

C#中简单的继承和多态

今天我们来聊一聊继承&#xff0c;说实话今天也是我第一次接触。 继承的概念是什么呢&#xff1f;就是一个类可以继承另一个类的属性和方法&#xff08;成员&#xff09; 继承是面向对象编程中的一个非常重要的特性。 好了&#xff0c;废话不多说&#xff0c;下面切入正题&a…

微信小程序使用camera扫码获取相机权限

确保用户隐私指引已经明确使用相机功能 “mp-weixin”: "permission": {"scope.camera": {"desc": "需要使用相机功能&#xff0c;请授权"}}wx.authorize({scope: scope.camera,success(res) {console.log(res, 用户成功授权)// 用户…

C语言实现Hoare版快速排序(递归版)

Hoare版 快速排序是由Hoare发明的&#xff0c;所以我们先来讲创始人的想法。我们直接切入主题&#xff0c;Hoare版快速排序的思想是将一个值设定为key&#xff0c;这个值不一定是第一个&#xff0c;如果你选其它的值作为你的key&#xff0c;那么你的思路也就要转换一下&#xf…

Mysql(事务)

Mysql&#xff08;事务&#xff09; 简介 是什么&#xff1a;一组操作的集合&#xff0c;不分割的工作单位&#xff0c;事务会把所有的操作作为一个整体&#xff0c;向数据库发起操作&#xff0c;要么全部失败要么全部成功。 案例&#xff1a; 银行转账 查询A的余额减少的A的余…

input , change ,blur 事件的区别,以及在vue和react中的表现

原生事件介绍 onInput Event 当一个 , , 或 元素的 value 被修改时&#xff0c;会触发 input 事件 onChange Event 当用户更改 、 和 元素的值时&#xff0c;change 事件在这些元素上触发。和 input 事件不同的是&#xff0c;并不是每次元素的 value 改变时都会触发 change…

SQL 算术运算符

SQL Server中的存储过程 什么是存储过程&#xff1f; 存储过程是一段预先编写好的 SQL 代码&#xff0c;可以保存在数据库中以供反复使用。它允许将一系列 SQL 语句组合成一个逻辑单元&#xff0c;并为其分配一个名称&#xff0c;以便在需要时调用执行。存储过程可以接受参数…

Qt线程池

创建一个类继承自QRunnable&#xff1a; class Thread02 : public QRunnable 重写run方法&#xff1a; void run() override; 在main函数里面加入线程池&#xff1a; Thread02 *th new Thread02();QThreadPool::globalInstance()->start(th); #include <QtCore/QC…

巧妙的使用WPF中的资源

其实&#xff0c;在wpf中&#xff0c;最核心的就是xaml&#xff0c;因为只有xaml&#xff0c;才能体现出用的是wpf&#xff0c;而不是普通的cs文件&#xff0c;cs文件在winform中等等程序都可以使用的&#xff0c;唯独xaml才是wpf中最重要的&#xff0c;最精华的东西&#xff0…

ARM按键中断

do_irq.c 判断中断号 #include "key_it.h" extern void printf(const char *fmt, ...); unsigned int i 0; void do_irq(void) {// 获取中断号&#xff0c;根据中断号的不同进行不同的中断处理int irqno;irqno GICC->IAR & 0x3ff;switch (irqno){case 99:…

gitlab ci pages

参考文章 gitlab pages是什么 一个可以利用gitlab的域名和项目部署自己静态网站的机制 开启 到gitlab的如下页面 通过gitlab.ci部署项目的静态网站 # build ruby 1/3: # stage: build # script: # - echo "ruby1"# build ruby 2/3: # stage: build …

jupyter notebook介绍、安装和使用

简介 Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算&#xff1a;开发、文档编写、运行代码和展示结果。——Jupyter Notebook官方介绍 简而言之&#xff0c;Jupyter Notebook是以网页的形式打开&#xff0c;可以在网页页面中直接编写代码和运…

vue3 + ts 判断各种数据类型,首字母转大写,下划转驼峰,的方法集合

vue3 ts 判断各种数据类型&#xff0c;首字母转大写&#xff0c;下划转驼峰&#xff0c;的方法集合(记录ing…) 1. 直接上代码 1. 在utils文件夹下新建 index.ts// index.ts/*** description: 判断是否为某个类型*/ export function is(val: unknown, type: string) {return …

SpringCache入门

1. SpringCache概述 Spring Cache 是 Spring 框架提供的一个用于提高应用性能的缓存抽象。它不是一个具体的缓存实现&#xff0c;而是提供了一组一致的编程模型来整合各种缓存机制&#xff0c;比如 EhCache、Caffeine、Redis 等。Spring Cache 使得开发者可以通过简单的注解来…

Spring Boot+Mybatis设置sql日志打印

在全局配置文件添加以下内容&#xff1a;logging.level.com.demo.mapperdebug&#xff0c;com.demo.mapper&#xff1a;src下的mapper路径&#xff0c;debug&#xff1a;设置日志打印级别为debug&#xff0c;亦可设置为&#xff1a;ERROR、WARN、INFO application.properties …

10-流媒体-RTMP编译

将h264推流给服务器&#xff0c;就完成了采集端的推流工作。一般在嵌入式系统常用的rtmp推流方案是rtmpdump。使用rtmp库涉及到一些编译过程&#xff0c;下面我们一点点描述。 关于rtmp的使用涉及到3个开源库的编译&#xff08;openssl, zlib, rtmpdump&#xff09;&#xff0c…

【C++】optional的使用(一)

这篇文章介绍下C17引入的std::optional 为什么要有 optional 一般来说&#xff0c;如果想要一个函数返回“多个”值&#xff0c;C程序员倾向于使用结构体/类完成这个操作。即定义一个通用的结构体&#xff0c;在函数内部完成装填&#xff0c;然后返回一个实例化的结构体。 #…

fckeditor编辑器改造示例:增加PRE,CODE控件

查看专栏目录 Network 灰鸽宝典专栏主要关注服务器的配置&#xff0c;前后端开发环境的配置&#xff0c;编辑器的配置&#xff0c;网络服务的配置&#xff0c;网络命令的应用与配置&#xff0c;windows常见问题的解决等。 文章目录 修改方法&#xff1a;1&#xff09;修改fckco…

Python项目——贪吃蛇

1、原理 整个界面由一个二维数组组成。游戏开始时&#xff0c;会随机生成一个苹果&#xff08;红点&#xff09;和一条蛇&#xff08;黄点&#xff09;。蛇会在二维数组中移动&#xff0c;当蛇碰到苹果时&#xff0c;苹果被吃&#xff0c;蛇的长度加一&#xff08;红点变黄点&…

性能测试

什么是性能测试&#xff1f;性能测试定义性能测试和功能测试区别性能测试常见术语及指标1&#xff1a;用户数3&#xff1a;响应时间4&#xff1a;事务5&#xff1a;每秒事务通过数6&#xff1a;用户点击率7&#xff1a;吞吐量8&#xff1a;吞吐率9&#xff1a;思考时间10&#…

C++函数返回值类型不确定处理办法-函数重载

如果有一个函数的返回值不确定是int还是float&#xff0c;比如&#xff1a; int func(const int& input) {return(input 1);} float func(const int& input) {return(input 1);} //重定义报错float a func(1); 这样定义肯定是会报错的。因为同名函数的重载只能用…