首页 > 其他分享 >移动语义的简单示例

移动语义的简单示例

时间:2023-06-09 09:04:21浏览次数:56  
标签:构造函数 示例 语义 other MyString 移动 data size

下面是一个使用移动语义的简单示例:

#include <iostream>
#include <string>
 
class MyString {
public:
    MyString() : m_data(nullptr), m_size(0) {}
 
    MyString(const char* str) : MyString() {
        m_size = strlen(str);
        m_data = new char[m_size + 1];
        strcpy_s(m_data, m_size + 1, str);
    }
 
    // 拷贝构造函数
    MyString(const MyString& other) : MyString() {
        if (other.m_data != nullptr) {
            m_size = other.m_size;
            m_data = new char[m_size + 1];
            strcpy_s(m_data, m_size + 1, other.m_data);
        }
    }
 
    // 移动构造函数
    MyString(MyString&& other) noexcept : m_data(other.m_data), m_size(other.m_size) {
        other.m_data = nullptr;
        other.m_size = 0;
    }
 
    ~MyString() { delete[] m_data; }
 
    // 赋值运算符重载(拷贝赋值)
    MyString& operator=(const MyString& other) {
        if (this != &other) {
            delete[] m_data;
            m_size = other.m_size;
            m_data = new char[m_size + 1];
            strcpy_s(m_data, m_size + 1, other.m_data);
        }
        return *this;
    }
 
    // 赋值运算符重载(移动赋值)
    MyString& operator=(MyString&& other) noexcept {
        if (this != &other) {
            delete[] m_data;
            m_data = other.m_data;
            m_size = other.m_size;
            other.m_data = nullptr;
            other.m_size = 0;
        }
        return *this;
    }
 
    char* getData() const { return m_data; }
    size_t getSize() const { return m_size; }
 
private:
    char* m_data;
    size_t m_size;
};
 
int main() {
    MyString s1("Hello");
    MyString s2(std::move(s1)); // 调用移动构造函数
    std::cout << "s2: " << s2.getData() << std::endl; // 输出 "s2: Hello"
    std::cout << "s1: " << (s1.getData() == nullptr ? "null" : s1.getData()) << std::endl; // 输出 "s1: null"
 
    MyString s3("World");
    s2 = std::move(s3); // 调用移动赋值运算符重载
    std::cout << "s2: " << s2.getData() << std::endl; // 输出 "s2: World"
    std::cout << "s3: " << (s3.getData() == nullptr ? "null" : s3.getData()) << std::endl; // 输出 "s3: null"
 
    return 0;
}

在这个示例中,我们定义了一个MyString类来管理字符串数据。该类有一个成员变量m_data指向字符串数据的内存空间,以及一个成员变量m_size表示字符串的长度。

为了支持移动语义,在类中定义了移动构造函数和移动赋值运算符重载函数。在移动构造函数中,我们将原有对象的资源所有权移交给新的对象,并将原有对象的m_data和m_size设为nullptr和0,以确保它们不会被析构函数释放。在移动赋值运算符重载函数中,我们先删除当前对象的指针成员变量,然后将右值对象的指针数据复制到当前对象中,再将右值对象的指针成员变量设为nullptr,以确保当前对象和右值对象独立管理各自的资源。

在main函数中,我们首先创建了一个MyString对象s1,然后通过调用std::move将其转移给另一个MyString对象s2。由于调用了移动构造函数,s2获得了s1的资源所有权,并将s1的指针成员变量设为nullptr。接着,我们通过调用std::move将另一个MyString对象s3的资源所有权转移到s2中,此时s2包含的字符串数据为"World"。最后,我们输出s1和s3的指针成员变量,可以看到它们都已经被设为nullptr。

通过这个示例,我们可以看到移动语义的使用方式,以及通过移动构造函数和移动赋值运算符重载实现资源所有权转移的方法。

标签:构造函数,示例,语义,other,MyString,移动,data,size
From: https://www.cnblogs.com/jobgeo/p/17468148.html

相关文章

  • 【京东JD电商平台api接口】获得JD商品详情接口PHP调用演示示例
    京东提供了商品详情API接口,可以帮助开发者获取到指定商品的详细信息,例如价格、库存、销售量、详情描述、图片等。具体获取方式如下:1. 首先需要在开放平台上申请API接口密钥。2.登录API接口调用地址。3. 根据API接口文档中的参数要求,构造API接口请求的参数。4. 将参数进行签......
  • Flask 开发个人博客简单示例
    步骤1:准备工作首先,确保您已经安装了Python和pip。然后,创建一个新的文件夹来存放项目,并在命令行中进入该文件夹。步骤2:创建虚拟环境为了隔离项目的依赖和环境,我们建议在项目文件夹中创建一个虚拟环境。在命令行中运行以下命令:python-mvenvvenv这将创建一个名为venv的虚拟环......
  • 初学者必看!Mock.js 示例详解
    Mock.js基础用法介绍Mock.js是一个常用于生成随机数据和拦截Ajax请求的JavaScript库。本文将介绍Mock.js的用法,包括安装和基础用法,在开始前我们可以看下看:了解Mock.js的语法规范。安装可以通过npm安装Mock.js:npm install mockjs基础用法随机生成一个用户信息使用Mock.js可以很......
  • python 安装包、基础学习资料、代码应用示例
    安装包python-3.7.0.rar链接:https://pan.baidu.com/s/1Gl5QUMrLFoTekENighd0iw提取码:ysgxpycharm5.0.3.zip链接:https://pan.baidu.com/s/1DpzRiMWSW2byWjB1cYmQKw提取码:9rgiAnaconda3jupyternotebook第一步进入:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/第......
  • 移动端预览PDF,pdf.js预览PDF文件流格式
     一开始使用了vue-pdf效果并不理想,满足不了要求还出现兼容问题,PDF.js似乎是一个完美的解决方案,号称兼容各种浏览器.快速且高效.界面按钮可以配置,而且也比原生iframe框架好看一些,但是一轮的使用下来,确确实实躺了不少的坑,特此记录一下全过程,希望以后使用的时候注意一点.以......
  • 移动应用架构新思路——WePY+小程序容器
    WePY(微信小程序开发框架)是一个基于组件化开发思想的微信小程序开发框架。它类似于Vue.js框架,通过封装小程序原生的API,提供了更加简洁、高效的开发方式。WePY的主要特点包括:组件化开发:WePY将页面拆分为多个组件,每个组件有自己的样式、模板和逻辑。这种组件化的开发方式能够提高......
  • 盘点| 三种移动跨平台方案
    跨平台技术是前端人必备技能,今天就来为大家解读一下近几年业界主流的三大移动端跨平台方案:Web天然跨平台:WebApp、PWA(ProgressiveWebApps)、HybridApp、PHA(ProgressHybridApp)都可以实现跨平台,WebView是一种基于浏览器内核的跨平台解决方案,通过在移动应用中嵌入一个浏览器......
  • sed命令简单使用示例分享
    Linux命令sed是“streameditor”的缩写,也就是流编辑器,它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(patternspace),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变......
  • element ui 中获取级联积极下拉框的示例
      <el-form-itemlabel="班组"prop="bz">              <el-cascader:options="orgTreeData"ref="bzNameRef":show-all-levels="false"                :props="{che......
  • 8、hive的关系运算、逻辑预算、数学运算、数值运算、日期函数、条件函数和字符串函数
    ApacheHive系列文章1、apache-hive-3.1.2简介及部署(三种部署方式-内嵌模式、本地模式和远程模式)及验证详解2、hive相关概念详解--架构、读写文件机制、数据存储3、hive的使用示例详解-建表、数据类型详解、内部外部表、分区表、分桶表4、hive的使用示例详解-事务表、视图、物......