C++中 右值引用 的用处

在C++中,std::move() 函数用于将一个对象转换为右值引用,这通常用于触发移动语义,特别是在资源转移(如动态分配的内存)的场景中,以避免不必要的拷贝操作。

使用 std::move() 的场景

当您想要将一个对象的资源(如动态分配的内存、文件句柄、网络连接等)转移给另一个对象时,使用 std::move() 是非常有用的。这通常发生在以下几种情况:

  1. 函数返回对象 :当函数返回一个局部对象时,使用 std::move() 可以避免拷贝,直接将资源转移给调用者。
  2. 对象赋值 :在给一个对象赋值时,如果赋值操作涉及资源的转移,使用 std::move() 可以提高效率。

示例代码

下面是一个示例,展示如何在对象之间使用 std::move() 来实现资源的转移:

复制代码
#include <iostream>
#include <string>
#include <utility> // 包含 std::move
using namespace std;

class Resource {
public:
	Resource() : data(new int(0)) {
		std::cout << "Resource constructed" << std::endl;
	}

	Resource(const Resource& other) : data(new int(*other.data)) {
		std::cout << "Resource copied" << std::endl;
	}

	Resource(Resource&& other) noexcept : data(other.data) {
		other.data = nullptr;
		std::cout << "Resource moved" << std::endl;
	}

	~Resource() {
		delete data;
		std::cout << "Resource destroyed" << std::endl;
	}

	Resource& operator=(const Resource& other) {
		if (this != &other) {
			delete data;
			data = new int(*other.data);
		}
		std::cout << "左值常引用的 = 号运算符重载被调用" << endl;
		return *this;
	}

	Resource& operator=(Resource&& other) noexcept {
		if (this != &other) {
			delete data;
			data = other.data;
			other.data = nullptr;
		}
		std::cout << "右值常引用的 = 号运算符重载被调用" << endl;
		return *this;
	}

private:
	int* data;
};

int main() {
	Resource r1;
	Resource r2 = std::move(r1); // 使用 std::move 触发移动构造函数
	// r1 的资源被移动到 r2,r1 的析构函数不会被调用,因为 r2 接管了资源
	Resource r3;
	r3 = r2;  //这个是调用等于号的重载运算符  参数为左值常引用的那个

	Resource r4;
	r4 = std::move(r2);  //这个是调用等于号的重载运算符  参数为右值常引用的那个

	return 0;
}
相关推荐
Pluto_CSND1 小时前
Java中的静态代理与动态代理(Proxy.newProxyInstance)
java·开发语言
将编程培养成爱好2 小时前
C++ 设计模式《外卖骑手状态系统》
c++·ui·设计模式·状态模式
猿太极2 小时前
设计模式学习(3)-行为型模式
c++·设计模式
惊讶的猫3 小时前
LSTM论文解读
开发语言·python
獨枭3 小时前
C# 本地项目引用失效与恢复全攻略
开发语言·c#·visual studio
随意起个昵称3 小时前
【递归】二进制字符串中的第K位
c++·算法
国服第二切图仔4 小时前
Rust开发之Trait 定义通用行为——实现形状面积计算系统
开发语言·网络·rust
mjhcsp4 小时前
C++ 循环结构:控制程序重复执行的核心机制
开发语言·c++·算法
A阳俊yi4 小时前
Spring Data JPA
java·开发语言