首页 > 其他分享 >cpp 移动

cpp 移动

时间:2024-05-17 19:44:20浏览次数:12  
标签:std rValue name val move cpp MyClass 移动

什么是移动

c++ 中 = 的默认操作是拷贝 每次操作内存的时候都会进行拷贝操作。移动操作相当于数据的转移,原来存放数据的地方没有这个值了。

左值引用,右值引用

int val{ 0 };
int&& rRef0{ getTempValue() };  // OK,引用临时对象
int&& rRef1{ val };  // Error,不能引用左值
int&& rRef2{ std::move(val) };  // OK,引用使用std::move标记的对象

移动操作需要使用一个右值引用, std::move 就是用来提供右值引用的。

编译器匹配右值引用的方式
1. 一个在语句执行完毕后就会被自动销毁的临时对象
2. 由std::move标记的非const对象

重载类的移动构造函数

class vector
{
public:
    void push_back(const MyClass& value)  // const MyClass& 左值引用
    {
        // 执行拷贝操作
    }

```cpp
    MyClass(MyClass&& rValue) noexcept  // 关于noexcept我们稍后会介绍
        : str{ std::move(rValue.str) }  // 看这里,调用std::string类型的移动构造函数
    {}
};

实现自己的移动构造类

class MyClass
{
public:
    MyClass()
        : val{ 998 }
    {
        name = new char[] { "Peter" };
    }

    // 实现移动构造函数
    MyClass(MyClass&& rValue) noexcept
        : val{ std::move(rValue.val) }  // 转移数据
    {
        rValue.val = 0;  // 清除被转移对象的数据

        name = rValue.name;  // 转移数据
        rValue.name = nullptr;  // 清除被转移对象的数据
    }
 // 移动赋值运算符
    MyClass& operator=(MyClass&& myClass) noexcept
    {
        val = myClass.val;
        myClass.val = 0;

        name = myClass.name;
        myClass.name = nullptr;

        return *this;
    }

    ~MyClass()
    {
        if (nullptr != name)
        {
            delete[] name;
            name = nullptr;
        }
    }

private:
    int val;
    char* name;
};

MyClass A{};
MyClass B{ std::move(A) };  // 通过移动构造函数创建新对象B

noexcept 的作用

太多了 ,记得写上就好

标签:std,rValue,name,val,move,cpp,MyClass,移动
From: https://www.cnblogs.com/bigsharker/p/18198465

相关文章

  • cpp 程序设计原理和实践(1)
    初始化的时候避免窄化doublex{2.4};如何将一个大任务分割为多个小任务基本原则抽象:不需要了解程序的具体实现细节,细节隐藏在相应的接口中。分治:将一个大问题分割为多个小问题。如何进行分割明确各个子程序之间的关系--按照功能进行划分是最简单的编程之前先进......
  • cpp priority_queue
    允许自己添加规则。默认是大根堆--<表示队列后面的元素要小于前面的元素。template<classT,classContainer=std::vector<T>,classCompare=std::less<typenameContainer::value_type>>classpriority_queue;同理建立小根堆priority_queue<int,ve......
  • cpp hash
    一般哈希表都是用来快速判断一个元素是否出现集合里。比如找到一个学生,在不在队列里,这种查找问题,使用hash表,可以快速执行。hash函数:用于将需要填充的值或者索引,映射到hashtable的索引上。哈希碰撞:如果两个事物的hashvalue相同,则出现hash碰撞。一般哈希碰撞有两......
  • Oracle移动文件
    关闭数据库SQL>shutdownimmediateDatabaseclosed.Databasedismounted.ORACLEinstanceshutdown.移动数据文件,用oracle用户操作[oracle@test~]$mv/u01/app/oracle/oradata/ORCL/system01.dbf/home/oracle/oradata/system01.dbf[oracle@test~]$mv/u01/app/oracl......
  • delphi 文件的操作:重命名、复制、移动、删除 文件(转)
    delphi文件的操作重命名、复制、移动、删除文件RenameFile('Oldname','Newname');CopyFile(PChar('Oldname'),PChar('Newname'),False);MoveFile(PChar('Oldname'),PChar('Newname'));DeleteFile(文件名);Delphi判断文件......
  • e语言 鼠标移动发送消息 (大漠版)
    大漠安装注册教程:https://www.bilibili.com/video/BV1mj411Z7PB/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=5fed6e8a7e3ad9f10860bf7a4540ba71......
  • vue---移动端登录页面
    最近在用vue做移动端,做了一个好看的移动端登录界面,保存一下,以后方便直接使用。具体代码:<template><divclass="main-login-container"><divclass="login-top"><imgclass="img":src="logintop"></div><divclass=&q......
  • ROS学习日记:(报错)terminate called after throwing an instance of 'rclcpp::excepti
    论坛里的一个老哥给出答案https://discourse.ros.org/t/how-to-shutdown-and-reinitialize-a-publisher-node-in-ros-2/4090就是我在初始化环境前先初始化了节点autonode=std::make_shared<Static_tf_broadcaster>(argv);rclcpp::init(argc,argv);rclcpp::spin(nod......
  • 模拟手机设备:使用 Playwright 实现移动端自动化测试
    前言在今天的Web开发中,移动设备已经成为用户访问网站的主要方式之一。因此,确保网站在移动设备上的正确显示和功能正常运行至关重要。Playwright是一个强大的自动化测试工具,可以帮助开发人员模拟各种移动设备,并进行自动化测试。本文将深入介绍如何使用Python编写代码来模拟......
  • WDS+MDT网络启动自动部署windows(十八)MDT 移动OU组织单位
    简介加入域时,如果计算机已存在,且OU设置不一致,可能会导致计算机孤立。使用Windows10(Windows10)刷新Windows7计算机-Windows10|Microsoft学习在刷新过程中,部署共享规则中指定的域加入详细信息将用于将计算机重新加入域。如果Windows7客户端在与MachineObjectOU指......