C++实现 对象移动 移动语义(什么是右值引用)

news2024/11/28 23:42:33

右值引用

        为了支持移动操作,C++11增加了右值引用。

        使用&&来定义

//int &num=100;//错误的使用方法,引用不能引用常量

int &&num=100;//正确的


//同样
int b=10;
//int &m=b*9+3;//错误的
int &&m=b*9+3;//正确的


//当然,这其中也包括函数的返回值在内

移动构造函数和移动赋值函数

1、移动构造函数

        移动构造函数的参数,是一个右值引用。当对象被临时创建兵立即初始化另一个对象的时候,回去调用移动构造函数。与普通构造函数不同,移动构造函数不会创建新对象的副本(不另外创建资源),而是直接使用其对象的内容,直接转移到新的对象。

移动构造传入的参数,一般函数结束后,就无法继续使用了

class MyClass {
public:
    // 移动构造函数
    MyClass(MyClass&& other) noexcept : data(other.data) {
        other.data = nullptr; // 将原始对象的资源置为nullptr,确保它不再拥有这些资源
    }

private:
    int* data; // 假设MyClass管理动态分配的内存
};
2、移动赋值函数

        同上,他需要的参数依旧是一个右值引用。

class MyClass {
public:
    // 移动赋值运算符
    MyClass& operator=(MyClass&& other) noexcept {
        if (this != &other) {
            delete[] data; // 释放当前对象的资源
            data = other.data; // 窃取其他对象的资源
            other.data = nullptr; // 将原始对象的资源置为nullptr
        }
        return *this; // 返回当前对象的引用
    }

private:
    int* data; // 假设MyClass管理动态分配的内存
};

这段代码定义的是 MyClass 类的移动赋值运算符。

移动赋值运算符使用的是右值引用为参数,在这个过程中,当前对象的资源先被释放,然后“窃取”其他对象的资源,并将其他对象的资源指针设置为 nullptr,确保其他对象不再拥有这些资源。最后,返回当前对象的引用。这是移动语义的典型应用,用于支持异常安全的资源管理。

noexcept

        在 C++ 中,noexcept 关键字用于声明一个函数不会抛出异常。它被放置在函数声明的尾部,用来告诉编译器该函数保证不会抛出任何异常。

   noexcept 可以被用作函数的属性,以优化程序性能,并确保异常安全。

move

最常见的移动函数。它的主要作用就是,把左值转化成右值。需要引入头文件utility

#include <iostream>
#include <utility>
#include <string>

using namespace std;

int main()
{
    string s1 = "quiijie";
    string s2 = s1;
    cout << "s1=" << s1 << endl;
    cout << "s2=" << s2 << endl;
    
    string s3 = move(s1);//这里使用了move
    cout << "s1=" << s1 << endl;//s1已经被销毁掉了
    cout << "s3=" << s3 << endl;
    
    return 0;
}

这里也可以理解成,剪切+复制的操作,非常好理解。


每日金句:

        人生就是一场必败的擂台,生老病痛,求之不得每一个都能让你再起不能,最后死亡再给你一记重拳把你打趴下,擂台上有输赢的标准,但评判这条命我们自己才最有资格,输赢不重要,重要的是如何挥出下一拳。                                                              ———尾巴大爷

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

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

相关文章

什么是DevOps,如何才能获取DevOps相关实践

DevOps 是 “Development”&#xff08;开发&#xff09;和 “Operations”&#xff08;运维&#xff09;的缩写&#xff0c;代表一种融合开发和运维的文化和实践。它强调开发团队与运维团队的协作&#xff0c;通过自动化流程和持续交付&#xff0c;提高软件交付的速度、质量和…

通过Express + Vue3从零构建一个用户认证与授权系统(三)前端应用工程构建

前言 接下来&#xff0c;我们将使用 Vue 3、TypeScript 和 Vite 构建一个前端应用&#xff0c;与之前构建的后端 API 无缝对接。此前端将处理用户认证、显示用户数据、管理角色和权限&#xff0c;并确保与后端的安全通信。首先&#xff0c;我们来构建一个满足基本开发的前端应…

Spring6梳理14——依赖注入之P命名空间

以上笔记来源&#xff1a; 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09;https://www.bilibili.com/video/BV1kR4y1b7Qc 目录 ①搭建模块 ②引入配置文件 ③创建bean-dip.xml文件 ④创建课程类文件 ⑤创建学生…

【C++】string类(2)

&#x1f973;个人主页: 起名字真南 &#x1f973;个人专栏:【数据结构初阶】 【C语言】 【C】 目录 引言1 模拟实现string类基本框架2 实现string类中的主要成员函数2.1 Push_Back 函数2.2 reserve 函数2.3 append 函数2.4 c_str 函数2.5 begin ,end 函数2.5 operator 函数2.6…

FileLink内外网文件交换——致力企业高效安全文件共享

随着数字化转型的推进&#xff0c;企业之间的文件交流需求日益增加。然而&#xff0c;传统的文件传输方式往往无法满足速度和安全性的双重要求。FileLink作为一款专注于跨网文件交换的工具&#xff0c;致力于为企业提供高效、安全的文件共享解决方案。 应用场景一&#xff1a;项…

Python酷玩之旅_数据分析入门(matplotlib)

导览 前言matplotlib入门1. 简介1.1 Pairwise data1.2 Statistical distributions1.3 Gridded data1.4 Irregularly gridded data1.5 3D and volumetric data 2. 实践2.1 安装2.2 示例 结语系列回顾 前言 翻看日历&#xff0c;今年的日子已划到了2024年10月19日&#xff0c;今天…

网络空间安全之一个WH的超前沿全栈技术深入学习之路(一:渗透测试行业术语扫盲)作者——LJS

欢迎各位彦祖与热巴畅游本人专栏与博客 你的三连是我最大的动力 以下图片仅代表专栏特色 [点击箭头指向的专栏名即可闪现] 专栏跑道一 ➡️网络空间安全——全栈前沿技术持续深入学习 专栏跑道二➡️ 24 Network Security -LJS ​ ​ ​ 专栏跑道三 ➡️ MYSQL REDIS Advanc…

vue登录页面

这里写目录标题 登录业务流程表单如何进行校验自定义校验规则整个表单的统一内容校验 封装登录接口axios的二次封装整个项目api的统一管理 调用接口 登录业务流程 表单如何进行校验 ElementPlus表单组件内置了表单校验功能&#xff0c;只需要按照组件要求配置必要参数即可 1.…

【880线代】线性代数一刷错题整理

第一章 行列式 2024.8.20日 1. 2. 3. 第二章 矩阵 2024.8.23日 1. 2024.8.26日 1. 2. 3. 4. 5. 2024.8.28日 1. 2. 3. 4. 第四章 线性方程组 2024.9.13日 1. 2. 3. 4. 5. 2024.9.14日 1. 第五章 相似矩阵 2024.9.14日 1. 2024.9.15日 1. 2. 3. 4. 5. 6. 7. 2024.9.…

蚂蚁华东师范大学:从零开始学习定义和解决一般优化问题LLMOPT

&#x1f3af; 推荐指数&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f; &#x1f4d6; title&#xff1a;LLMOPT: Learning to Define and Solve General Optimization Problems from Scratch &#x1f525; code&#xff1a;https://github.com/caigaojiang/LLMOPT &am…

YOLOv11改进-卷积-空间和通道重构卷积SCConv

本篇文章将介绍一个新的改进模块——SCConv&#xff08;小波空间和通道重构卷积&#xff09;&#xff0c;并阐述如何将其应用于YOLOv11中&#xff0c;显著提升模型性能。为了减少YOLOv11模型的空间和通道维度上的冗余&#xff0c;我们引入空间和通道重构卷积。首先&#xff0c;…

如何开启华为交换机 http

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…

pc轨迹回放制作

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;pc轨迹回放制作 主要内容&#xff1a;制作车辆轨迹操作页&#xff0c;包括查询条件、动态轨迹回放、车辆轨迹详情表单等 应用场景&#xff1a;车辆…

14.归一化——关键的数据预处理方法

引言 在人工智能&#xff08;AI&#xff09;和机器学习中&#xff0c;归一化&#xff08;Normalization&#xff09;是一个重要的预处理步骤。它的主要目的是将数据转换到某个特定的范围。归一化可以帮助模型更高效地学习和提高预测的准确性。归一化在数据预处理方法中占据核心…

Jupyter Notebook中 Save and Export Notebook As不显示选项

问题 Jupyter Notebook中 Save and Export Notebook As 不显示选项&#xff08;保存和导出没有选项&#xff09; 解决 在jupyter notebook所在环境卸载jupyter_contrib_nbextensions&#xff0c;这是我之前安装的一个扩展工具集&#xff0c;从而导致上面的问题。 pip unin…

自动化数据处理:使用Selenium与Excel打造的数据爬取管道

随着互联网信息爆炸式增长&#xff0c;获取有效数据成为决策者的重要任务。人工爬取数据不仅耗时且效率低下&#xff0c;因此自动化数据处理成为一种高效解决方案。本文将介绍如何使用Selenium与Excel实现数据爬取与处理&#xff0c;结合代理IP技术构建一个可稳定运行的数据爬取…

Nodejs使用http模块创建Web服务器接收解析RFID读卡器刷卡数据

本示例使用设备&#xff1a; https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.1d292c1buHvw58&ftt&id22173428704 Javascript源码 //引用http模块创建web服务器&#xff0c;监听指定的端口获取以GET、POST、JSON等方式上传的数据&#xff0c;并回应驱动读卡…

图像梯度-Sobel算子、scharrx算子和lapkacian算子

文章目录 一、认识什么是图像梯度和Sobel算子二、Sobel算子的具体使用三、scharrx算子与lapkacian(拉普拉斯)算子 一、认识什么是图像梯度和Sobel算子 图像的梯度是指图像亮度变化的空间导数&#xff0c;它描述了图像在不同方向上的强度变化。在图像处理和计算机视觉中&#x…

CUDA error: out of memory问题

加载模型时&#xff0c;模型也不大&#xff0c;GPU内存也完全够&#xff0c;但就是出现这个CUDA内存溢出问题。 究其原因&#xff0c;在于model.load_state_dict(torch.load(‘pretrain-model.pth’, map_locationdevice))这个代码省略了map_locationdevice 通过torch.load加载…

YOLOv11来了 | 自定义目标检测

概述 YOLO11 在 2024 年 9 月 27 日的 YOLO Vision 2024 活动中宣布&#xff1a;https://www.youtube.com/watch?vrfI5vOo3-_A。 YOLO11 是 Ultralytics YOLO 系列的最新版本&#xff0c;结合了尖端的准确性、速度和效率&#xff0c;用于目标检测、分割、分类、定向边界框和…