c++[左值+右值](25)

news2024/9/23 5:19:00

左值

对左值取别名
在这里插入图片描述
左值举例

int main()
{
	//左值:可以取地址
	int a = 10;
	const int b = 20;
	int* p = &a;             //a,b,p均是左值
	*p = 100;                 //*p也是左值
	return 0;
}

左值引用举例

int main()
{
	//以下 p、b、c、*p都是左值
	int* P = new int(0);
	int b = 1;
	const int c = 2;
	//以下是对左值的引用(取别名)
	int*& rp = p;
	int& rb = b;
	const int& rc = c;
	int& pvalue = *p;
	
	return 0;
}

右值

在这里插入图片描述

int main()
{
	//以下 p、b、c、*p都是左值
	int* P = new int(0);
	int b = 1;
	const int c = 2;
	//以下是对左值的引用(取别名)
	int*& rp = p;
	int& rb = b;
	const int& rc = c;
	int& pvalue = *p;
	
	int x = 1.1, y = 2.2;
	//以下为常见右值:不能取地址
	10;
	x + y;
	fmin(x, y);

	//右值引用
	int&& rr1 = 10;
	int&& rr2 = x + y;
	int&& rr3 = fmin(x, y);
	
//左值引用右值
	//double& r1 = x + y;
	const double& r1 = x + y;
	
//右值引用左值,可以引用move后的左值
	//int&& rr5 = b;
	int&& rr5 = move(b);
	return 0;
}

const T& x 既能接受左值又能接受右值

template<class T>
void Func(const T& x)
{
//x既能接收左值,又能接收右值
}

左值引用只能引用左值,不能引用右值,但是const左值引用既可以引用左值,又可以引用右值
右值引用只能引用右值,不能引用左值,但是可以引用move以后的左值
在这里插入图片描述
在这里插入图片描述
此处rr1和rr2是左值

引用的价值:减少拷贝

在这里插入图片描述
右值引用(Rvalue reference)是C++11引入的一种特性,它可以解决以下几个问题:

  1. 资源转移:右值引用允许对象的资源(如指针、文件句柄等)被转移到另一个对象,而不是进行深拷贝。这可以提高性能,特别是对于大型对象或容器类对象。通过移动语义,可以避免不必要的资源拷贝,减少内存和时间的开销。

  2. 完美转发:右值引用还允许完美转发(Perfect Forwarding),即将参数以原样传递给另一个函数,而不会丢失其值类别(左值或右值)。这对于泛型编程非常有用,可以保留传递参数的准确类型信息,并将其传递给下一个函数。

  3. 临时对象的优化:右值引用可以优化临时对象的创建和销毁。临时对象是指在表达式中创建的临时对象,例如函数返回值、临时变量等。通过使用右值引用,可以避免不必要的拷贝构造和析构函数的调用,提高性能。

  4. 移动语义:右值引用是实现移动语义的基础。移动语义允许对象的资源被转移,而不是进行深拷贝。这对于容器类对象、动态分配的内存等资源管理非常有用,可以提高性能和效率。

移动赋值||移动拷贝||移动构造

移动赋值(Move Assignment)是C++11引入的一种特性,它允许对象之间的资源转移,而不是进行深拷贝。移动赋值通常用于提高性能,特别是对于大型对象或容器类对象。

移动赋值操作符使用双引号(&&)作为参数,并且通常返回一个引用。它的语法如下:

class MyClass {
public:
    // 移动赋值操作符
    MyClass& operator=(MyClass&& other) {
        // 执行资源转移操作
        // ...
        return *this;
    }
};

移动赋值操作符接受一个右值引用参数(MyClass&& other),表示要转移资源的对象。在函数体内部,你可以执行资源的转移操作,例如将指针或资源所有权从other对象转移到当前对象。最后,返回一个引用以支持链式赋值操作。

移动拷贝(Move Copy)是指在C++11中引入的一种特性,它允许通过移动语义来进行对象的拷贝操作。移动拷贝通常用于避免不必要的对象拷贝,提高性能。

移动拷贝操作符使用双引号(&&)作为参数,并且通常返回一个新的对象。它的语法如下:

class MyClass {
public:
    // 移动拷贝操作符
    MyClass(MyClass&& other) {
        // 执行资源转移操作
        // ...
    }
};

移动拷贝操作符接受一个右值引用参数(MyClass&& other),表示要拷贝的对象。在函数体内部,你可以执行资源的转移操作,例如将指针或资源所有权从other对象转移到新创建的对象。

移动构造(Move Construction)是指使用移动语义来创建新对象的过程。移动构造通常用于避免不必要的对象拷贝,提高性能。

移动构造函数使用双引号(&&)作为参数,并且不需要返回任何值。它的语法如下:

class MyClass {
public:
    // 移动构造函数
    MyClass(MyClass&& other) {
        // 执行资源转移操作
        // ...
    }
};

移动构造函数接受一个右值引用参数(MyClass&& other),表示要创建新对象的源对象。在函数体内部,你可以执行资源的转移操作,例如将指针或资源所有权从other对象转移到新创建的对象。

需要注意的是,移动赋值、移动拷贝和移动构造都是使用右值引用参数(&&)来实现的,这是C++11引入的一种特性,用于表示临时对象或可以被转移资源的对象。

希望这可以帮助你理解移动赋值、移动拷贝和移动构造的概念!如果还有其他问题,请随时提问。

万能引用

          t既可以引用左值也可以引用右值
void Fun(int& x) { cout << "左值引用" << endl; }
void Fun(const int& x) { cout << "const 左值引用" << endl; }

void Fun(int&& x) { cout << "右值引用" << endl; }
void Fun(const int&& x) { cout << "const 右值引用" << endl; }
template<typename T>
void PerfectForward(T&& t)
{
	Fun(t);
	//完美转发   保持原属性
	Fun(std::forward<T>(t));
}

传左值就是左值&&会被折叠为&
传右值会变成左值(t为左值)
若一直为万能引用属性会丢失

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

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

相关文章

《向量数据库指南》:向量数据库Pinecone如何集成Elasticsearch

目录 上传嵌入模型 上传数据集 创建嵌入 将Elasticsearch索引移动到Pinecone 概要 是一个强大的开源搜索引擎和分析平台,广泛用作基于关键字的文本搜索的文档存储。 Pinecone是一个广泛用于生产应用程序的向量数据库,例如语义搜索、推荐系统和威胁检测,需要在数亿甚…

【多模态】20、OVR-CNN | 使用 caption 来实现开放词汇目标检测

文章目录 一、背景二、方法2.1 学习 视觉-语义 空间2.2 学习开放词汇目标检测 三、效果 论文&#xff1a;Open-Vocabulary Object Detection Using Captions 代码&#xff1a;https://github.com/alirezazareian/ovr-cnn 出处&#xff1a;CVPR2021 Oral 一、背景 目标检测数…

关于rtthread的I/O设备模型

分层 从官方给的架构可以看出&#xff0c;官方是将IO设备的使用分成了三层。 IO设备管理层&#xff1a;也就是正常用户接触的一层&#xff0c;用户直接调用该层接口实现IO设备的操作。例如代码中的device.c文件 设备驱动框架层&#xff1a;这一层可以称为中间层了&#xff0c…

Spring之BeanDefinition(三)

Spring之BeanDefinition&#xff08;三&#xff09; 文章目录 Spring之BeanDefinition&#xff08;三&#xff09;一、Spring的启动类三行代码研究二、Spring创建工厂类型和属性三、Spring中内置的BeanDefinition四、注册配置类五、BeanDefinition总结 一、Spring的启动类三行代…

Few Shot Classification小知识——数据集的加载

概述 Few-shot classification&#xff08;小样本分类&#xff09;是机器学习和人工智能的一个子领域&#xff0c;解决的问题是在训练数据非常有限的情况下&#xff0c;学习对新样本进行分类。在传统的监督学习中&#xff0c;模型需要在包含大量标记样本的数据集上进行训练&am…

Linux安装wget

1.第一步登录wget官网下载地址&#xff0c;下载最新的wget的rpm安装包到本地 官网地址&#xff1a;http://mirrors.163.com/centos/7/os/x86_64/Packages/ 2.将下载好的wget的rpm安装包通过Xftp工具上传到Linux服务器对应目录下。 3.cd命令进入到这个wget目录下&#xff0c;再…

【文献分享】动态环境下竟然能实现实时语义RGB-D SLAM??

论文题目&#xff1a;Towards Real-time Semantic RGB-D SLAM in Dynamic Environments 中文题目&#xff1a;动态环境下实时语义RGB-D SLAM研究 作者&#xff1a;Tete Ji, Chen Wang, and Lihua Xie 作者机构&#xff1a;新加坡南洋理工大学电气与电子工程学院 卡内基梅隆大…

用于WINDOWS的HACKRF ONE扫频分析仪

https://github.com/pavsa/hackrf-spectrum-analyzer GitHub - mutability/rtl-sdr: RTL-SDR *very* experimental branch - its probably broken! https://github.com/greatscottgadgets/hackrf hackrf_sweep 用于WINDOWS的HACKRF ONE扫频分析仪 几个星期前&#xff0c;Ha…

Java动态代理(全网最详细,没有之一)

首先你要明白为什么要创建代理&#xff1f;&#xff1f;&#xff1f; 例如&#xff1a;我们看下面这张图我们发现&#xff0c;有很多重复的代码&#xff0c;我们就可以创建代理&#xff0c;让代理帮我们干这些事情。 1.想要创建代理&#xff0c;我们就要为这个类写一个接口 pu…

无涯教程-jQuery - Menu组件函数

小部件菜单功能可与JqueryUI中的小部件一起使用。一个简单的菜单显示项目列表。 Menu - 语法 $( "#menu" ).menu(); Menu - 示例 以下是显示菜单用法的简单示例- <!doctype html> <html lang"en"><head><meta charset"utf-…

基于Linux操作系统中的MySQL数据库备份(三十三)

目录 一、概述 二、数据备份的重要性 三、造成数据丢失的原因 1、程序错误 2、人为错误 3、运算失败 4、磁盘故障 5、灾难&#xff08;如火灾、地震&#xff09;和盗窃 四、备份类型 &#xff08;一&#xff09;物理与逻辑角度 1、物理备份 1.1、冷备份 1.2、热备…

人工智能-Dlib+Python实现人脸识别(人脸识别篇)

人脸识别流程 人脸检测,人脸数据提取:首先是检测到人脸保存人脸数据:可以保存到mysql数据库中mysql数据库连接mysql数据库安装mysql数据库操作设置人脸数据标签:(人脸名字),保存到数据库打开摄像头,检测到人脸,提取人脸数据:人脸数据与数据库中的数据对比,1、人脸检…

子组件未抛出事件 父组件如何通过$refs监听子组件中数据的变化

我们平时开发项目会使用一些比较成熟的组件库, 但是在极小的情况下,可能会出现我们需要监听某个属性的变化,使我们的页面根据这个属性发生一些改变,但是偏偏组件库没有把这个属性抛出来,当我们使用watch通过refs监听时,由于生命周期的原因还不能拿到,这时候我们可以这样做,以下…

03-高阶导数_导数判断单调性_导数与极值

高阶导数 前面学的是一阶导数&#xff0c;对导数再次求导就是高阶导数&#xff0c;二阶和二阶以上的导数统称为高阶导数。 导数与函数单调性的关系 极值定理 导数为我们寻找极值提供依据&#xff0c;对于可导函数而言&#xff0c;因为在极值位置必然有函数的导数等于 0。 …

深入篇【C++】手搓模拟实现list类(详细剖析底层实现原理)模拟实现正反向迭代器【容器适配器模式】

深入篇【C】手搓模拟实现list类(详细剖析底层实现原理&#xff09;&& 模拟实现正反向迭代器【容器适配器模式】 Ⅰ.迭代器实现1.一个模板参数2.两个模板参数3.三个模板参数 Ⅱ.反向迭代器实现1.容器适配器模式 Ⅲ.list模拟实现1.定义结点2.封装结点3.构造/拷贝4.迭代器…

【Python】Web学习笔记_flask(1)——模拟登录

安装flask pip3 install flask 第一部分内容&#xff1a; 1、主页面输出hello world 2、根据不同用户名参数输出用户信息 3、模拟登录 from flask import Flask,url_for,redirectappFlask(__name__)app.route(/) def index():return hello worldapp.route(/user/<uname…

linux_进程状态

目录 一. 概念铺设 状态是什么&#xff1f; 传统操作系统的状态转换图 二. 传统操作系统状态 1. 运行 2. 阻塞 3. 挂起 三. linux 中的进程状态 1. 总体介绍 2. R 3. S 4. D kill -9 D vs S 5. T kill T vs S 6. Z 什么是僵尸状态&#xff1f; 僵尸进程的危害 …

hadoop部署配置

端口名称 Hadoop2.x Hadoop3.x NameNode内部通信端口 8020 / 9000 8020 / 9000/9820 NameNode HTTP UI 50070 9870 MapReduce查看执行任务端口 8088 8088 历史服务器通信端口 19888 19888 端口名称Hadoop2.xHadoop3.xNameNode内部通信端口8020 / 90008020 / 9000/9820NameNode…

延长周末,获得高质量休息:工作与学习党的生活策略

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

【Linux】多线程的补充

1 线程安全的单例模式 1.1 什么是单例模式 单例模式是一种 "经典的, 常用的, 常考的" 设计模式. 1.2 什么是设计模式 IT行业这么火, 涌入的人很多. 俗话说林子大了啥鸟都有. 大佬和菜鸡们两极分化的越来越严重. 为了让菜鸡们不太拖大佬的后腿, 于是大佬们针对一些…