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;
}
相关推荐
郑州光合科技余经理4 小时前
同城系统海外版:一站式多语种O2O系统源码
java·开发语言·git·mysql·uni-app·go·phpstorm
一只乔哇噻4 小时前
java后端工程师+AI大模型开发进修ing(研一版‖day60)
java·开发语言·人工智能·学习·语言模型
LNN20224 小时前
Linuxfb+Qt 输入设备踩坑记:解决 “节点存在却无法读取“ 问题
开发语言·qt
暗然而日章4 小时前
C++基础:Stanford CS106L学习笔记 4 容器(关联式容器)
c++·笔记·学习
foxsen_xia5 小时前
go(基础06)——结构体取代类
开发语言·算法·golang
巨人张5 小时前
C++火柴人跑酷
开发语言·c++
ID_180079054735 小时前
基于 Python 的 Cdiscount 商品详情 API 调用与 JSON 核心字段解析(含多规格 SKU 提取)
开发语言·python·json
悟能不能悟5 小时前
Caused by: java.sql.SQLException: ORA-28000: the account is locked怎么处理
java·开发语言
亦是远方6 小时前
南京邮电大学使用计算机求解问题实验一(C语言简单编程练习)
c语言·开发语言·实验报告·南京邮电大学
我是哈哈hh6 小时前
【Python数据分析】Numpy总结
开发语言·python·数据挖掘·数据分析·numpy·python数据分析