我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++中右值引用与移动语义的方法是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++中右值引用与移动语义的方法是什么

今天小编给大家分享一下C++中右值引用与移动语义的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    意义

    充分利用临时对象,避免拷贝。

    左值右值

    值类别

    在 C++11之后,C++根据

    • 被标识:可通过不同标识符指代同一实体。(对象/内存)

    • 可移动:可作为移动语义函数的参数,例如移动构造,移动赋值。

    将值分为以下类别:

    泛左值:被标识

    • 左值:被标识且不可移动

    • 将亡值:被标识可移动

    右值:可移动

    • 将亡值:被标识可移动

    • 纯右值:不被标识且可移动

    左值

    int a = 1;

    a是一个左值,左值是关联了名称的内存位置。

    纯右值

    int a = 1;

    1是一个纯右值,纯右值是指不被标识且可移动的值,例如字面量。

    将亡值

    using std::string;string get(){string ret = "abc";return ret;}string str = get();

    get() 函数调用会产生一个临时变量赋给str,这个临时变量是将亡值,此时的赋值是移动语义(c++11之前是复制语义)。

    左值引用

    int a = 1;int& a_lref = a;

    a_lref是左值引用

    右值引用

    int&& rref = 1;

    rref是右值引用(rref是类型为右值引用的左值)

    std::move()

    void foo(int&& rref){}int a = 1;foo(std::move(a));

    std::move本质是类型转换,即把左值转换成右值

    注意:被转换的对象不应再被使用,否则结果难以预计(通常内存会被转移)

    移动构造&移动赋值运算符重载

    class Foo{public:Foo(){m_data = malloc(32);}Foo(const Foo& rhs){if(m_data == nullptr){m_data = malloc(32);}memcopy(m_data,rhs.m_data,32);}Foo& operator = (const Foo& rhs){if(m_data == nullptr){m_data = malloc(32);}memcopy(m_data,rhs.m_data,32);return *this;}Foo(Foo&& rhs) noexcept{m_data = rhs.m_data;rhs.m_data = nullptr;}Foo& operator = (Foo&& rhs) noexcept{m_data = rhs.m_data;rhs.m_data = nullptr;return *this;}private:void* m_data}

    移动构造的本质就是内存资源所有权的转移

    测试&验证

    #include <iostream>#include <cstdlib>#define LOG(Args) std::cout << "==== " << Args << " ====" << std::endlnamespace My{class Vector{public:Vector() noexcept{LOG("Ctor");m_data = new int[] {0, 0, 0, };}~Vector(){LOG("Dector");m_data = new int[] {0, 0, 0, };}Vector(const Vector& rhs){LOG("Copy");if (m_data == nullptr){m_data = new int[3];}memcpy(m_data, rhs.m_data, 3 * sizeof(int));}Vector& operator = (const Vector& rhs) {LOG("Copy Operator = ");if (m_data == nullptr){m_data = new int[3];}memcpy(m_data, rhs.m_data, 3 * sizeof(int));return *this;};Vector& operator = (Vector&& rhs) noexcept{LOG("Move Operator = ");m_data = rhs.m_data;rhs.m_data = nullptr;return *this;};Vector(Vector&& rhs) noexcept{LOG("Move");m_data = rhs.m_data;rhs.m_data = nullptr;}void print(){std::cout << "X = " << m_data[0] <<" , " << "Y = " << m_data[1] <<" , " << "Z = " << m_data[2] << std::endl;}void set(int x,int y,int z){m_data[0] = x;m_data[1] = y;m_data[2] = z;}private:int* m_data;};}My::Vector Get(){My::Vector vec;vec.set(4, 5, 6);return vec;}void main(){My::Vector vec1;My::Vector vec2;LOG("vec1");vec1.print();vec1.set(0, 1, 2);LOG("vec1");vec1.print();vec1 = vec2;LOG("vec1");vec1.print();vec1 = std::move(vec2);LOG("vec1");vec1.print();My::Vector* vp1 = new My::Vector();LOG("vp1");vp1->print();My::Vector* vp2 = new My::Vector(*vp1);LOG("vp2");vp2->print();My::Vector* vp3 = new My::Vector(std::move(*vp1));LOG("vp3");vp3->print();My::Vector* vp4 = new My::Vector(Get());LOG("vp4");vp4->print();}

    输出

    C++中右值引用与移动语义的方法是什么

    以上就是“C++中右值引用与移动语义的方法是什么”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    C++中右值引用与移动语义的方法是什么

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    C++中右值引用与移动语义的方法是什么

    今天小编给大家分享一下C++中右值引用与移动语义的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。意义充分利用临时对
    2023-07-05

    C++11右值引用和移动语义的方法是什么

    本文小编为大家详细介绍“C++11右值引用和移动语义的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++11右值引用和移动语义的方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。左值引用与右值
    2023-07-05

    C++右值引用,移动语义与完美转发得方法

    本篇内容主要讲解“C++右值引用,移动语义与完美转发得方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++右值引用,移动语义与完美转发得方法”吧!C++——左值与右值
    2023-06-29

    一文带你了解C++中的右值引用与移动语义

    本篇文章主要为大家详细介绍了C++中的右值引用与移动语义的相关知识,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2023-05-13

    C++右值引用与移动构造函数应用的方法是什么

    这篇文章主要讲解了“C++右值引用与移动构造函数应用的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++右值引用与移动构造函数应用的方法是什么”吧!1.右值引用右值引用是 C++
    2023-07-05

    C语言中什么是左值引用与右值引用

    这篇文章主要介绍“C语言中什么是左值引用与右值引用”,在日常操作中,相信很多人在C语言中什么是左值引用与右值引用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言中什么是左值引用与右值引用”的疑惑有所帮助!
    2023-06-16

    C++11右值引用方法是什么

    本篇内容介绍了“C++11右值引用方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!左值和右值在C++表达式的特性中有一个左值和右值的
    2023-06-19

    C++中左值与右值的概念与应用方法是什么

    这篇文章主要讲解了“C++中左值与右值的概念与应用方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++中左值与右值的概念与应用方法是什么”吧!什么是左值与右值?左值(Lvalue)
    2023-07-05

    C语言宏的定义与使用方法是什么

    本文小编为大家详细介绍“C语言宏的定义与使用方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言宏的定义与使用方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、C语言中的宏定义#define
    2023-06-30

    c语言函数的定义与调用方法是什么

    C语言函数的定义和调用方法如下:1. 函数的定义:在C语言中,函数的定义包括函数的返回类型、函数名、参数列表和函数体。函数的定义一般写在main函数之前或者使用函数原型声明。函数定义的一般形式如下:返回类型 函数名(参数列表) {函数体}例
    2023-08-18

    c语言中函数的定义方法是什么

    在C语言中,函数的定义通常包含以下几个部分:1. 返回类型:函数可以有不同的返回类型,如int、float、void等,用来表示函数返回的数据类型。2. 函数名:用来标识函数的名称,可以根据需要自定义。3. 参数列表:函数可以接受一定数量的
    2023-09-29

    c++中string声明与赋值的方法是什么

    在C++中,可以使用以下三种方法声明和赋值string变量:1. 使用赋值运算符(=)来声明和赋值一个字符串变量。```cppstd::string str = "Hello, World!";```2. 使用构造函数来声明和赋值一个字符串
    2023-09-15

    C语言中带返回值的宏定义方式是什么

    这篇文章主要介绍“C语言中带返回值的宏定义方式是什么”,在日常操作中,相信很多人在C语言中带返回值的宏定义方式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言中带返回值的宏定义方式是什么”的疑惑有所
    2023-07-05

    C#中的预定义类型与引用类型是什么

    今天小编给大家分享一下C#中的预定义类型与引用类型是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、预定义的值类型一个
    2023-06-30

    c语言转义字符的使用方法是什么

    在C语言中,转义字符以反斜杠(\)开头,用于表示一些特殊字符或控制字符,例如换行符(\n)、制表符(\t)、回车符(\r)、退格符(\b)等。转义字符的使用方法是在需要输入特殊字符时,在字符前加上反斜杠即可。例如,要在字符串中输出换行符,可
    c语言转义字符的使用方法是什么
    2024-03-01

    c语言中全局变量定义的方法是什么

    在C语言中,全局变量可以在函数外部定义。以下是全局变量定义的方法:1. 在所有函数的外部定义变量,这样变量就可以在程序的任何地方访问。```cint globalVariable; // 全局变量定义```2. 在定义变量的同时进行初始化。
    2023-09-29

    C语言中getchar的使用方法是什么

    getchar()函数用于从标准输入流(stdin)读取一个字符,并返回该字符的ASCII码值。它的基本用法如下:int getchar(void);使用getchar()函数时,通常需要将返回的字符值赋给一个整型变量,然后再进行其他操作
    C语言中getchar的使用方法是什么
    2024-03-06

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录