当前位置: 首页 > article >正文

C++实现 对象移动 移动语义(什么是右值引用)

右值引用

        为了支持移动操作,C++11增加了右值引用。

        使用&&来定义

//int &num=100;//错误的使用方法,引用不能引用常量

int &&num=100;//正确的


//同样
int b=10;
//int &m=b*9+3;//错误的
int &&m=b*9+3;//正确的


//当然,这其中也包括函数的返回值在内

移动构造函数和移动赋值函数

1、移动构造函数

        移动构造函数的参数,是一个右值引用。当对象被临时创建兵立即初始化另一个对象的时候,回去调用移动构造函数。与普通构造函数不同,移动构造函数不会创建新对象的副本(不另外创建资源),而是直接使用其对象的内容,直接转移到新的对象。

移动构造传入的参数,一般函数结束后,就无法继续使用了

class MyClass {
public:
    // 移动构造函数
    MyClass(MyClass&& other) noexcept : data(other.data) {
        other.data = nullptr; // 将原始对象的资源置为nullptr,确保它不再拥有这些资源
    }

private:
    int* data; // 假设MyClass管理动态分配的内存
};
2、移动赋值函数

        同上,他需要的参数依旧是一个右值引用。

class MyClass {
public:
    // 移动赋值运算符
    MyClass& operator=(MyClass&& other) noexcept {
        if (this != &other) {
            delete[] data; // 释放当前对象的资源
            data = other.data; // 窃取其他对象的资源
            other.data = nullptr; // 将原始对象的资源置为nullptr
        }
        return *this; // 返回当前对象的引用
    }

private:
    int* data; // 假设MyClass管理动态分配的内存
};

这段代码定义的是 MyClass 类的移动赋值运算符。

移动赋值运算符使用的是右值引用为参数,在这个过程中,当前对象的资源先被释放,然后“窃取”其他对象的资源,并将其他对象的资源指针设置为 nullptr,确保其他对象不再拥有这些资源。最后,返回当前对象的引用。这是移动语义的典型应用,用于支持异常安全的资源管理。

noexcept

        在 C++ 中,noexcept 关键字用于声明一个函数不会抛出异常。它被放置在函数声明的尾部,用来告诉编译器该函数保证不会抛出任何异常。

   noexcept 可以被用作函数的属性,以优化程序性能,并确保异常安全。

move

最常见的移动函数。它的主要作用就是,把左值转化成右值。需要引入头文件utility

#include <iostream>
#include <utility>
#include <string>

using namespace std;

int main()
{
    string s1 = "quiijie";
    string s2 = s1;
    cout << "s1=" << s1 << endl;
    cout << "s2=" << s2 << endl;
    
    string s3 = move(s1);//这里使用了move
    cout << "s1=" << s1 << endl;//s1已经被销毁掉了
    cout << "s3=" << s3 << endl;
    
    return 0;
}

这里也可以理解成,剪切+复制的操作,非常好理解。


每日金句:

        人生就是一场必败的擂台,生老病痛,求之不得每一个都能让你再起不能,最后死亡再给你一记重拳把你打趴下,擂台上有输赢的标准,但评判这条命我们自己才最有资格,输赢不重要,重要的是如何挥出下一拳。                                                              ———尾巴大爷


http://www.kler.cn/news/356714.html

相关文章:

  • 基于SSM+微信小程序的房屋租赁管理系统(房屋2)
  • 反转链表 K个一组翻转链表
  • Mac中安装以及配置adb环境
  • winUI3 c++ 入门 1、入门几个坑
  • Linux学习笔记9 文件系统的基础
  • 算法之二分查找法
  • IP地理位置定位系统之应用场景划分
  • 大厂面试真题-说一说rpc和http的区别?http能否代替kafka
  • ui自动化知识点-web端
  • 无向图中的一些问题与处理(上接无向图知识简记)
  • GitLab 老旧版本如何升级?
  • 玩转大模型(二)启动一个大模型
  • 怎样将pdf转换成ppt?关于几种PDF转PPT的方法介绍
  • web端使用高德地图逆地理编码
  • GOT-OCR-2-GUI - 一个强大的AI文本识别模型 OCR文字识别 图片文字识别 本地一键整合包下载
  • 【ROS2实操五】通信机制补充
  • 2024年诺贝尔物理学奖揭晓:AI背后的“造梦者”是谁?
  • Thread的基本用法
  • MySQL 中utfmb3和utfmb4字符集区别
  • 算法——python实现归并排序