【移动语义与移动构造】

移动语义与移动构造

你可以把右值想成"临时工":事情做完就要下班了。这个时候如果还让它把手里的资料整份复印一遍再交接,就很浪费。

于是 C++11 做了一件事:引入 T&& 来接住右值/将亡值。

既然都要退场了,那就别复制了,直接把资源交接过去就行。

这一步,就是我们说的移动语义。

再往下就很自然了:语言里专门给了三件工具来做这件事,分别是移动构造、移动赋值和 std::move

所以这章其实不是突然冒出来的新知识,而是上一章"右值引用"顺着往下长出来的结果。

  1. 结论

移动语义的核心不是"复制资源",而是"转移资源所有权"。

所以它可以在很多场景下避免深拷贝,提高性能。

  1. 移动构造函数

移动构造函数用于"用右值初始化新对象"。

常见写法是接管对方资源,然后把源对象置为可析构状态。

cpp 复制代码
class MyString {
public:
    char* data{};

    MyString(const char* s = "") {
        size_t n = std::strlen(s);
        data = new char[n + 1];
        std::memcpy(data, s, n + 1);
    }

    MyString(MyString&& other) noexcept
        : data(other.data) {
        other.data = nullptr;
    }

    ~MyString() {
        delete[] data;
    }
};
  1. 移动赋值函数

移动赋值用于"把一个右值赋给已存在对象"。

要先释放自己原有资源,再接管对方资源,同时处理自赋值保护。

cpp 复制代码
MyString& operator=(MyString&& other) noexcept {
    if (this != &other) {
        delete[] data;         // 先释放旧资源
        data = other.data;     // 接管新资源
        other.data = nullptr;  // 源对象置空
    }
    return *this;
}
  1. std::move 的作用

std::move(x) 不会移动任何数据,它只是把 x 转成右值表达式。

真正是否移动,取决于类型是否实现了移动构造/移动赋值。

  1. 拷贝与移动对比
cpp 复制代码
std::string s1 = "hello";
std::string s2 = s1;              // 拷贝:复制内容
std::string s3 = std::move(s1);   // 移动:转移资源

注意:被 move 之后的对象仍然"有效",但其值处于"未指定"状态。

通常只对它做重新赋值、销毁等安全操作,不依赖原内容。

相关推荐
basketball61618 分钟前
C++ bitset 头文件完全指南
开发语言·c++
散峰而望38 分钟前
【算法练习】算法练习精选:陶陶摘苹果(基础+升级)、Music Notes、字串变换,你能AC几道?
数据结构·c++·算法·leetcode·贪心算法·github·动态规划
誰能久伴不乏38 分钟前
libmodbus 在 Windows 环境下报 “Invalid argument“ 的排错记录
c++·qt·modbus
大菜菜小个子1 小时前
偏特化(Partial Specialization)理解
c++
吴可可1231 小时前
Win7上开发CAD2004自定义实体全解析
c++·算法
noipp1 小时前
推荐题目:洛谷 P16510 [GKS 2015 #C] gRanks
java·c语言·开发语言·c++·python·算法
程序喵大人1 小时前
从内存/汇编角度看C与C++:指针、引用、对象的底层差异
c语言·汇编·c++·指针·引用·对象
晚风吹红霞2 小时前
C++ vector 深度剖析:从入门到模拟实现,避开所有坑
开发语言·c++
不会C语言的男孩2 小时前
C++ Primer 第5章:语句
开发语言·c++
Swift社区2 小时前
OpenHarmony鸿蒙PC平台移植 gifsicle:CC++ 三方库适配实践(Lycium tpc_c_cplusplus)
c语言·c++·harmonyos