C++11新特性—— 移动语义 (std::move)

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);

}


我这里没有打印验证信息,大家可以自行打印感受一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值