MyClass obj1(42); // 创建一个对象
MyClass obj2 = std::move(obj1); //通过move调用移动构造函数
概念:
move 本身并不会“移动”变量,只是将其参数转换为右值引用(后续我会出右值引用笔记)
实际上就是类型转换,std::move(obj1) = (MyClass&&) obj1
目的:
允许移动语义的使用,允许将资源从一个对象 转移 到另一个对象,减少不必要打的资源拷贝
使用:
1、为了支持移动语义,类中需要提供移动构造函数和移动赋值运算符。(如果不提供,编译器会使用默认拷贝构造)
class MyClass {
private:
int* data;
public:
// 构造函数
MyClass(int value) : data(new int(value)) {
}
// 析构函数
~MyClass() {
delete data;
}
// 移动构造函数
MyClass(MyClass&& other) noexcept : data(other.data) {
other.data = nullptr; // 把原对象的指针置为 nullptr,避免析构时重复释放内存
}
// 移动赋值运算符
MyClass& operator = (MyClass&& other) noexcept {
if (this != &other) {
delete data;
data = other.data;
other.data = nullptr;
}
return *this;
}
};
noexcept 关键字:告诉编译器该函数绝对不会抛出异常,否则编译器会进行额外的异常安全检查,某些标准库容器(如vector)会依赖 noexcept 来决定是否使用移动语义,如果无该关键字,容器可能会退回使用拷贝构造函数!
int main() {
MyClass obj1(42);
MyClass obj2 = std::move(obj1);
MyClass obj3(10);
obj3 = std::move(obj2);
}
我这里没有打印验证信息,大家可以自行打印感受一下