C++左值引用与右值引用

server/2024/9/23 3:22:00/

首先,我们需要知道什么是值语义,什么是引用语义。

值语义:
  • 值语义意味着对象在被传递、赋值或拷贝时,会复制其整个数据。
  • 当使用值语义时,对对象进行操作不会影响原始对象,因为操作会在副本上进行。
  • 传统的内置类型(如整数、浮点数等)通常具有值语义。
引用语义:
  • 引用语义意味着对象在被传递、赋值或拷贝时,不会复制其整个数据,而是共享相同的数据。
  • 当使用引用语义时,对对象的操作会影响所有引用该对象的变量,因为它们都指向相同的内存位置。
  • 指针和引用是引用语义的典型例子。

对于GC语言,大部分变量都是引用语义,内存管理交给GC。而值语义可以更方便直观控制对象生命周期,让RAII使用更自然。

其次,我们需要区分一下左值与右值:

左值:
  • 可以在等号左边,可以取地址,具名
  • 比如变量名,返回左值引用的函数调用,前置的自增自减,赋值运算和复合赋值运算,解引用
右值:
  • 只能在等号右边,不能取地址,不具名
  • 纯右值
    • 字面量,返回非引用类型的函数调用,后置自增自减,算数/逻辑表达式
  • 将亡值
    • C++11引入与移动语义相关的值类型(移动构造、移动赋值运算符重载),转移上资源,不可以转移上资源

区别:

  1. 左值引用是对左值的引用;右值引用是对右值的引用
    • const左值引用能指向右值,但不能修改
    • 右值引用通过std::move()指向左值
    • 声明出来的左值引用和右值引用都是左值
  2. 功能差异:
    • 左值引用避免拷贝,如函数传参,函数返回值
    • 右值引用实现移动语义:
      • 对象赋值时,避免资源的重新分配
      • 移动构造,移动赋值运算符重载
      • STL
      • std::unique_ptr
      • std::function

注:std::forward()是与universal reference相配合使用

最后给大家推荐一个LinuxC/C++高级架构系统教程的学习资源与课程,可以帮助你有方向、更细致地学习C/C++后端开发,具体内容请见 https://xxetb.xetslk.com/s/1o04uB


http://www.ppmy.cn/server/13957.html

相关文章

力扣面试 150二叉搜索树迭代器 中序遍历 栈模拟递归 步骤拆分

Problem: 173. 二叉搜索树迭代器 思路 &#x1f469;‍&#x1f3eb; 三叶 复杂度 时间复杂度: O ( 1 ) O(1) O(1) 空间复杂度: O ( h ) O(h) O(h) Code class BSTIterator { Stack<TreeNode> d new Stack<>();public BSTIterator(TreeNode root){dfsLe…

深入解析YOLOv2

深入解析YOLOv2 引言 目标检测是计算机视觉中的一个核心问题&#xff0c;它旨在识别图像中所有感兴趣的目标&#xff0c;并给出它们的类别和位置。近年来&#xff0c;随着深度学习技术的发展&#xff0c;目标检测领域取得了巨大的进步。YOLO&#xff08;You Only Look Once&a…

vue 瀑布流布局 复制即用

插件 npm install vue-waterfall-plugin-next 或者 yarn add vue-waterfall-plugin-next 点击vue-waterfall-plugin-next进入文档 组件 <template><Waterfall :lazyload"false" :breakpoints"breakpoints" :gutter"8" :list"…

【零基础入门TypeScript】环境

目录 定义环境 句法 例子 环境声明是告诉 TypeScript 编译器实际源代码存在于其他地方的一种方式。当您使用大量第三方js库&#xff08;如 jquery/angularjs/nodejs&#xff09;时&#xff0c;您无法在 TypeScript 中重写它。对于 TypeScript 程序员来说&#xff0c;在使用这…

中国航天日特辑 | PARASOFT——从NASA JPL到航空航天的星辰大海

4月24日&#xff0c;是中国航天日&#xff08;Space Day of China&#xff09;&#xff0c;一个庆祝和纪念中国航天事业成就的特殊时刻。在这一天&#xff0c;我们不仅仅是赞颂那些辉煌的航天成就&#xff0c;还要探讨那些为航天事业做出重大贡献的合作伙伴和技术解决方案提供者…

BUUCTF---misc---[SWPU2019]我有一只马里奥

1、下载附件是一个.exe文件 2、运行之后可以看到桌面生成了1.txt文件&#xff0c;文件里面有如下内容 3、经过信息搜索&#xff1a;NTFS&#xff08;New Technology File System&#xff09;是一种由Microsoft开发的专有日志文件系统。根据它的提示&#xff0c;应该是把flag.tx…

【七】jmeter5.5+influxdb2.0+prometheus+grafana

参考文章&#xff1a;https://blog.csdn.net/wenxingchen/article/details/126892890 https://blog.csdn.net/Zuo19960127/article/details/119726652 https://blog.csdn.net/shnu_cdk/article/details/132182858 promethus参考 由于自己下载的是infuldb2.0&#xff0c;所以按照…

Android 12 如何加载 native 原生库

在 Android 7.0 及更高版本中&#xff0c;系统库与应用库是分开的。 图1. 原生库的命名空间 原生库的命名空间可防止应用使用私有平台的原生 API&#xff08;例如使用 OpenSSL&#xff09;。该命名空间还可以避免应用意外使用平台库&#xff08;而非它们自己的库&#xff09;的…