C++笔记之std::move和右值引用的关系、以及移动语义

C++笔记之std::move和右值引用的关系、以及移动语义

code review!

文章目录

  • C++笔记之std::move和右值引用的关系、以及移动语义
    • 1.一个使用std::move的最简单C++例子
    • 2.`std::move` 和 `T&& reference_name = expression;`对比
    • 3.右值引用和常规引用的经典对比——移动语义和拷贝语义
    • 4.关于 `data = new char[size + 1];`
    • 5.std::move的使用场景列举

1.一个使用std::move的最简单C++例子

在这里插入图片描述

2.std::moveT&& reference_name = expression;对比

在这里插入图片描述

3.右值引用和常规引用的经典对比——移动语义和拷贝语义

右值引用允许我们利用移动构造函数从临时对象中“窃取”资源,避免不必要的拷贝,从而提高效率。而常规引用则会触发拷贝构造函数,产生一个新的对象副本。

在这里插入图片描述

代码

#include <iostream>
#include <string>class MyString {
public:MyString(const char* str) {size = strlen(str);data = new char[size + 1];strcpy(data, str);std::cout << "Constructor: " << data << std::endl;}// 拷贝构造函数MyString(const MyString& other) {size = other.size;data = new char[size + 1];strcpy(data, other.data);std::cout << "Copy Constructor: " << data << std::endl;}// 移动构造函数MyString(MyString&& other) noexcept {size = other.size;data = other.data;other.size = 0;other.data = nullptr;std::cout << "Move Constructor: " << data << std::endl;}~MyString() {delete[] data;}void printData() const {if (data)std::cout << "Data: " << data << std::endl;elsestd::cout << "Data is empty." << std::endl;}private:size_t size;char* data;
};int main() {MyString str1 = "Hello, World!"; // 调用构造函数MyString str2 = str1;            // 调用拷贝构造函数MyString str3 = std::move(str1); // 调用移动构造函数std::cout << "str1: ";str1.printData(); // 输出空,因为资源已被移动std::cout << "str2: ";str2.printData(); // 输出 "Hello, World!"std::cout << "str3: ";str3.printData(); // 输出 "Hello, World!"return 0;
}

4.关于 data = new char[size + 1];

在C++中,使用以null终止的字符串(C风格字符串)时,需要为字符串的内容分配足够的内存来存储字符,同时还需要一个额外的空间来存储字符串的null终止字符(‘\0’),表示字符串的结束。

例如,考虑字符串 “Hello”,它实际上占用了5个字符的内存,即 ‘H’、‘e’、‘l’、‘l’、‘o’,但为了使其成为一个有效的C风格字符串,需要在字符串的末尾添加一个null终止字符 ‘\0’。

因此,为了正确存储以null终止的字符串,我们需要分配的内存大小应该为字符串的长度加上一个额外的字符来存储null终止字符。这就是为什么在 data = new char[size + 1]; 语句中,使用了 size + 1 来分配足够的内存以容纳字符串内容和null终止字符。

在C++中,通过这种方式分配内存,并将字符存储在数组中,就可以实现以null终止的字符串表示。这种约定允许我们使用标准的C字符串库函数来操作和处理字符串,例如 strcpystrlen 等。

5.std::move的使用场景列举

在这里插入图片描述

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

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

相关文章

LC-路径总和

LC-路径总和 链接&#xff1a;https://leetcode.cn/problems/path-sum/description/ 描述&#xff1a;给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。…

Python爬虫——scrapy_日志信息以及日志级别

日志级别&#xff08;由高到低&#xff09; CRITICAL&#xff1a; 严重错误 ERROR&#xff1a; 一般错误 WARNING&#xff1a; 警告 INFO&#xff1a; 一般警告 DEBUG&#xff1a; 调试信息 默认的日志等级是DEBUG 只要出现了DEBUG或者DEBUG以上等级的日志&#xff0c;那么这些…

linux驱动学习3-外部中断

在做中断试验时&#xff0c;发现中断驱动总是insmod失败&#xff0c;之后定位到 gpio_request 失败&#xff0c;之后是想到使用的野火做好的系统&#xff0c;在uEnv.txt中会加载大量设备树插件&#xff0c;将key相关的设备树插件屏蔽即可。 linux中断API函数 中断号 每个中断…

嵌入式学习之C语言指针部分复习

今天主要把C语言的指针部分再次认真的复习了一下&#xff0c;对于指针的整体框架有了更加深刻的理解&#xff0c;特别要重点区分函数指针&#xff0c;指针函数&#xff0c;数组指针&#xff0c;指针数组部分&#xff0c;对于这部分的应用非常重要&#xff0c;而且C语言指针部分…

如祺出行递表,港交所迎来首位Robotaxi商业化观察对象

港交所近年来持续对新经济公司和科技创新类公司释放善意&#xff0c;接连优化上市条款&#xff0c;摆出“筑巢引凤”姿态。这也让外界对新兴领域的兴趣大大增加。 8月18日&#xff0c;出行科技与服务公司如祺出行正式递表港交所&#xff0c;其业务模式为Robotaxi和有人驾驶网约…

【数据结构】堆的初始化——如何初始化一个大根堆?

文章目录 源码是如何插入的&#xff1f;扩容向上调整实现大根堆代码&#xff1a; 源码是如何插入的&#xff1f; 扩容 在扩容的时候&#xff0c;如果容量小于64&#xff0c;那就2倍多2的扩容&#xff1b;如果大于64&#xff0c;那就1.5倍扩容。 还会进行溢出的判断&#xff0c…

一些异常情况

对象注入失败 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name hotelServiceImpl: Unsatisfied dependency expressed through field baseMapper; nested exception is org.springframework.beans.factory.NoSuchBeanDefini…

【图像分类】基于卷积神经网络和主动学习的高光谱图像分类(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Python功能制作之3D方块

介绍 用python写一个黑窗口&#xff0c;窗口里面有一个白色的3D方块&#xff0c;左键按下后移动可以旋转以各个视角来看方块。 当然有需要的话&#xff0c;可以自己在代码中去更改颜色&#xff0c;直接通过RBG的参数进行更改即可。 做了两个函数&#xff1a;init[初始化]和d…

每天一道leetcode:127. 单词接龙(图论困难建图广度优先遍历)

今日份题目&#xff1a; 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> ... -> sk&#xff1a; 每一对相邻的单词只差一个字母。 对于 1 < i < k 时&#xff0c;每个 si 都在 wordList 中…

windows搭建WebDAV服务,并内网穿透公网访问【无公网IP】

windows搭建WebDAV服务&#xff0c;并内网穿透公网访问【无公网IP】 文章目录 windows搭建WebDAV服务&#xff0c;并内网穿透公网访问【无公网IP】1. 安装IIS必要WebDav组件2. 客户端测试3. cpolar内网穿透3.1 打开Web-UI管理界面3.2 创建隧道3.3 查看在线隧道列表3.4 浏览器访…

开源的密码学工具库:openssl安装在docker容器环境Linux(ubuntu18.04)

OpenSSL&#xff08;Open Secure Socket Layer&#xff09;是一个开源的密码学工具库&#xff0c;它提供了一系列的加密、解密、认证和通信安全相关的功能。OpenSSL 最初是为了支持安全的网络通信而设计的&#xff0c;但后来它的功能逐渐扩展到了许多不同的领域&#xff0c;包括…