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;
}
相关推荐
blasit9 小时前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
肆忆_1 天前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
不想写代码的星星2 天前
虚函数表:C++ 多态背后的那个男人
c++
端平入洛3 天前
delete又未完全delete
c++
端平入洛4 天前
auto有时不auto
c++
郑州光合科技余经理5 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1235 天前
matlab画图工具
开发语言·matlab
dustcell.5 天前
haproxy七层代理
java·开发语言·前端
norlan_jame5 天前
C-PHY与D-PHY差异
c语言·开发语言
哇哈哈20215 天前
信号量和信号
linux·c++