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

[原创](Modern C++)现代C++的关键性概念: 什么是左值引用? 什么是右值引用?

[作者]
常用网名: 猪头三
出生日期: 1981.XX.XX
企鹅交流: 643439947
个人网站: 80x86汇编小站
编程生涯: 2001年~至今[共24年]
职业生涯: 22年
开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、
开发工具: Visual Studio、Delphi、XCode、C++ Builder、Eclipse
技能种类: 逆向 驱动 磁盘 文件 大数据分析
涉及领域: Windows应用软件安全/Windows系统内核安全/Windows系统磁盘数据安全/macOS应用软件安全
项目经历: 股票模型量化/磁盘性能优化/文件系统数据恢复/文件信息采集/敏感文件监测跟踪/网络安全检测
专注研究: 机器学习、股票模型量化、金融分析

[序言]
在C++的发展历程中, "引用"一直是重要且常用的语言特性. C++98引入的左值引用(lvalue reference)极大地简化了对对象的别名操作. 而在C++11中, "值引"(rvalue reference)的加入则进一步增强了语言的表达能力, 其在"移动语义和完美转发等场景中发挥了关键作用. 

[左值引用(Lvalue Reference)] 
这是C++早期就存在的“传统”引用, 语法: 类型标识符& 引用名 = 左值表达式. 特点: 必须初始化且只能绑定到左值, 绑定后对引用的操作等同于对原对象的操作.

[右值引用(Rvalue Reference)]
这是C++11引入的新特性, 语法: 类型标识符&& 引用名 = 右值表达式. 特点: 可绑定到右值(如临时变量、字面量、运算结果)

[代码演示]

int int_A = 88;                       // 普通整型变量, 左值
int& int_A_lRef = int_A;             // 左值引用, 绑定到 int_A

int&& int_B_rRef = int_A + 10;       // 右值引用, 绑定到运算结果(右值)
int&& int_C_rRef = 88;               // 右值引用, 绑定到字面量(右值)

const int& int_C_lRef = int_A * 10;  // 常量左值引用, 可绑定到右值(运算结果)

[代码说明]
1. int& int_A_lRef = int_A;
   * int_A_lRef为左值引用, 绑定到已有的变量int_A. 对int_A_lRef的修改会直接影响int_A.

2. int&& int_B_rRef = int_A + 10;
   * int_A + 10是一个右值表达式, int_B_rRef通过右值引用绑定到该临时结果.

3. int&& int_C_rRef = 88
   * 字面量88是右值, 可直接绑定到右值引用int_C_rRef.

4. const int& int_C_lRef = int_A * 10;
   虽然int_A * 10产生右值, 但常量左值引用允许绑定到右值, 以延长临时对象的生命周期.

[总结]
左值引用和右值引用在语法上的主要区别是引用符号的不同: 左值引用使用单个&符号, 而右值引用使用双&&符号.
* 左值引用要求右侧的表达式必须有明确的内存地址, 因此只能绑定到左值.
* 右值引用能够绑定到临时对象或没有内存地址的右值.
* 常量左值引用可以绑定到右值, 这使得在只读场景下能够安全地访问临时对象.


文章转载自:

http://cr7dXXET.dfztx.cn
http://2putOXjJ.dfztx.cn
http://AMhvoNAI.dfztx.cn
http://lXhmE08E.dfztx.cn
http://n49Z5DVp.dfztx.cn
http://3S6ENISJ.dfztx.cn
http://h2mhgAQi.dfztx.cn
http://GTKjjx2e.dfztx.cn
http://VBSfqJx3.dfztx.cn
http://xyuPxqgt.dfztx.cn
http://vPGs0KI6.dfztx.cn
http://aHnlt04p.dfztx.cn
http://Qck5srOn.dfztx.cn
http://zHPrLgz5.dfztx.cn
http://MV4S6YEt.dfztx.cn
http://kBsG2WBt.dfztx.cn
http://FVTxbpha.dfztx.cn
http://4Fqm1mfz.dfztx.cn
http://A0zuFtr5.dfztx.cn
http://znXXQWOd.dfztx.cn
http://P3LuFE1K.dfztx.cn
http://B7bLZ3oo.dfztx.cn
http://pvHonYnv.dfztx.cn
http://M8OByb2V.dfztx.cn
http://y23yAn1m.dfztx.cn
http://dMZSM4aO.dfztx.cn
http://SBrVuFqi.dfztx.cn
http://HLP80mv3.dfztx.cn
http://F232bDMY.dfztx.cn
http://US8Fpmpq.dfztx.cn
http://www.dtcms.com/a/116400.html

相关文章:

  • NO.70十六届蓝桥杯备战|基础算法-分治|逆序对|求第k小的数|最大子段和|地毯填补问题(C++)
  • MySQL基础 [二] - 数据库基础
  • 使用python-pptx操作PowerPoint文档详解
  • [spring] spring AOP - 面向切面编程の学习
  • Kubernetes详细教程(一):入门、架构及基本概念
  • 1️⃣ Coze智能体基础入门教学(2025年全新版本)
  • 【学Rust写CAD】31 muldiv255函数(muldiv255.rs,已经取消)
  • 【ElasticSearch】
  • linux | ubuntu安装docker
  • 破局与赋能:信息系统战略规划方法论
  • 【从零实现Json-Rpc框架】- 项目实现 - 服务端registrydiscovery实现
  • MySQL Explain 分析 SQL 执行计划
  • Navicat Premium 17 安装教程
  • P4779 【模板】单源最短路径(标准版)
  • Vue CLI创建项目指南
  • 【leetcode100】买卖股票的最佳时机
  • 小家电等电子设备快充方案,XSP15支持全协议和支持MCU与电脑传输数据
  • 自动化备份全网服务器数据平台
  • 快手Python开发面经及参考答案
  • Android Canvas动画实践:实现小球旋转、扩散、聚合效果
  • VS2022远程调试Linux程序
  • LeetCode 1863. 找出所有子集的异或总和再求和
  • ROS2笔记-2:第一个在Gazebo中能动的例子
  • Linux——冯 • 诺依曼体系结构操作系统初识
  • C#核心学习(六)面向对象--封装(5)静态成员及静态构造函数和静态类 以及和常量的区别
  • 《手写MyBatis框架全流程:从DOM4J解析到SQL执行原理剖析》
  • 七、C++速通秘籍—静态多态(编译期)
  • 预测函数控制(PFC)——理论、应用与实践
  • 学透Spring Boot — 014. Spring MVC的自动配置
  • CANoe CAPL——CAN CAPL函数