【C++】移动构造函数和移动赋值运算符

下面是关于移动构造函数移动赋值运算符的示例:


移动构造函数的例子

#include <iostream>
#include <vector>

class MyClass {
public:
    std::vector<int> data;

    // 默认构造函数
    MyClass() {
        std::cout << "Default constructor" << std::endl;
    }

    // 移动构造函数
    MyClass(MyClass&& other) noexcept : data(std::move(other.data)) {
        std::cout << "Move constructor" << std::endl;
    }

    // 复制构造函数
    MyClass(const MyClass& other) : data(other.data) {
        std::cout << "Copy constructor" << std::endl;
    }
};

int main() {
    MyClass obj1;
    obj1.data.push_back(10);

    MyClass obj2 = std::move(obj1); // 调用移动构造函数

    return 0;
}

说明:

  • 当使用 std::move(obj1) 初始化 obj2 时,调用了 MyClass 的移动构造函数。
  • 移动构造函数接收一个右值引用参数,并将资源从 other 移动到新对象。

移动赋值运算符的例子

#include <iostream>
#include <vector>

class MyClass {
public:
    std::vector<int> data;

    // 默认构造函数
    MyClass() {
        std::cout << "Default constructor" << std::endl;
    }

    // 移动赋值运算符
    MyClass& operator=(MyClass&& other) noexcept {
        std::cout << "Move assignment operator" << std::endl;
        if (this != &other) {
            data = std::move(other.data);
        }
        return *this;
    }

    // 复制赋值运算符
    MyClass& operator=(const MyClass& other) {
        std::cout << "Copy assignment operator" << std::endl;
        if (this != &other) {
            data = other.data;
        }
        return *this;
    }
};

int main() {
    MyClass obj1;
    obj1.data.push_back(20);

    MyClass obj2;
    obj2 = std::move(obj1); // 调用移动赋值运算符

    return 0;
}

说明:

  • 使用 std::move(obj1)obj1 转换为右值引用,然后赋值给 obj2,调用移动赋值运算符。
  • 移动赋值运算符需要检查自赋值,并将资源从 other 移动到当前对象。

注意事项

  • noexcept:建议在移动构造函数和移动赋值运算符后添加 noexcept,以便标准库可以进行优化。
  • 自赋值检查:在移动赋值运算符中,检查 this != &other,防止自赋值导致未定义行为。
  • 资源管理:确保在移动操作后,源对象的资源状态是有效的,但可以是空的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fighting的码农(zg)-GPT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值