深入理解 C++ 中的引用:左值引用与右值引用

深入理解C++右值引用与完美转发 在现代C++编程中,右值引用和完美转发是两个极其重要的概念,它们为C++带来了革命性的性能提升和更灵活的编程范式。作为C++11标准引入的核心特性,它们不仅改变了我们编写代码的方式,也深刻影响了标准库的设计。本文将全面剖析这两个概念,从基础原理到实际应用,帮助读者彻底掌握这项关键技术。 阅读详情

你是否在写函数参数时,纠结该用 int& 还是 int&&?🤔

你是不是也曾被左值、右值、引用、&&这些名词搞得一头雾水?🤯

别担心,其实搞清楚它们比你想象的容易得多!

今天我们不谈复杂的移动语义、不聊完美转发,只专注一点:理解引用本身的本质与用法。🚀

什么是引用?🔁

引用就是给某个对象起个别名,让我们可以用另一个名字来操作它。

想象你把a这个变量也叫小A,你叫谁都能改那个变量的值。

引用的几个小特点:

  • 必须立即绑定对象,绑定后就不能换了 🪢
  • 不占独立内存,它只是别名,不是副本 📛
  • 使用上更简洁,不像指针要到处解引用 ✨

C++ 中有两种引用:

  • 👉 左值引用 T&:绑定持久存在、有名字的变量(左值)
  • 👉 右值引用 T&&:绑定临时的、没名字的值(右值)

对左值与右值傻傻分不清的小伙伴可以看下这篇~

左值引用(Lvalue Reference)🧲

左值引用是 C++ 的传统艺能,用得最多。

🎯 特点总结:

  • 只能绑定到左值(变量、数组元素等)
  • 可以通过引用修改原对象
  • 非常适合函数参数、返回值的引用传递

📌 例子:

int a = 10;
int& ref = a;
ref = 20;

💬 ref 是 a 的别名,改 ref 就是改 a。

🧪 看下地址:

std::cout << "&a = " << &a << "\n";
std::cout << "&ref = " << &ref << "\n";

输出的地址是一样的,说明它们指向同一个东西:

&a   = 0x7ffeb3420e0c
&ref = 0x7ffeb3420e0c

右值引用(Rvalue Reference)⚡️

右值引用是 C++11 才引入的新能力,能绑定到临时对象。

它是进行资源优化(比如避免拷贝)的关键工具。

🎯 特点总结:

  • 只能绑定右值(临时的、没名字的东西)
  • 绑定后会延长临时对象的生命周期 ⏳
  • 常配合 std::move() 使用

📌 示例:

int&& rref = 10;
rref = 20;

std::cout << "rref = " << rref << "\n";
std::cout << "&rref = " << &rref << "\n";

🌟 虽然 10 是个右值,但通过右值引用 rref,我们接管了它,还能访问它的地址

这里说的访问,是通过右值引用间接访问,想要直接访问右值的地址是不行的

左值引用 vs 右值引用 📋

特性左值引用 T& 🧷右值引用 T&& 🔗
可绑定对象左值(有名对象)右值(临时值)
是否可修改✅✅
是否延长生命周期❌✅(绑定后延长)
应用场景参数传递、可修改返回临时对象处理、资源优化
能否绑定右值❌(除非 const)✅

注意事项⚠️

  • 引用一旦绑定,就不能再指向别的对象了 ❌

  • 右值引用变量本身是左值!(因为它有名字)

    int&& rref = 10;
    int& lref = rref;  // 合法,rref 是左值
    

🎯 小结

引用在 C++ 中是连接变量和内存世界的桥梁 🌉:

  • 左值引用帮我们操作已有变量

  • 右值引用帮我们接管临时对象

希望本文让你对引用有更加清晰的理解~😉
本文首发于微信公众号《Linux在秋名山》,欢迎大家关注~

[代码开源]基于DistFlow的IEEE33和IEEE69节点最优潮流模型(OPF)实现与性能分析 本文详细介绍了基于DistFlow的IEEE33和IEEE69节点最优潮流模型(OPF)的实现与性能分析。通过代码开源,展示了如何从零搭建电力系统优化模型,解决配电网中的发电成本最小化问题。文章涵盖数据准备、模型实现细节、性能优化建议及常见问题解答,为电力系统研究者提供实用参考。 阅读详情

相关推荐

S32K144 ADC硬件触发实战:PDB与TRGMUX配置避坑指南

本文深入解析了S32K144微控制器中ADC硬件触发的两种核心方案:PDB与TRGMUX。通过对比其架构差异、详细配置流程及常见问题排查,提供了从寄存器操作到DMA联动的完整优化指南,旨在帮助开发者解决多通道采样时序不稳、CPU负载过高等实际难题,实现高效稳定的数据采集。

weixin_29168153的博客 440

右值引用,std::move和 std::forward

这是四个概念是在c++中比较容易混淆的概念,这里简单梳理一下四者的区别、应用场景。 左值与右值 左值全称是左值表达式,简单的理解就是它可以作为赋值运算符的左边的表达式。 举个例子 // i是左值,10是右值 int i = 10; // j 是左值, i*10 是右值,因为它不能写在赋值运算符左边 int j = i * 10; 左值引用与右值引用 ...

超级码力 405

缠中说禅交易指南

战胜市场,其实就是战胜自己的贪婪、恐惧、愚蠢,缠中说禅技术分析理论只是把市场拔光给各位看,而拔光一个人并不意味着就等于征服一个人,对于市场,其道理是一样的。不干,不可能征服市场。对于市场来说,干就是一切。技术分析的最终意义不是去预测市场要干什么,而是分析市场正在干什么,是一种当下的直观。在市场上所有的错误都是离开了这当下的直观,用想象、用情绪来代替。 市场是有规律的,但市场的规律并不是显而易见的,是需要严格的分析才能得到。更重要的是,市场的规律是一种动态的,在不同级别合力作用下显示出来的规律,企图用些单纯的

baidu_25764509的博客 2万+

c++ 基础14、c++ 基础烹饪

c++ 基础烹饪

Mr-zhou先生 667

【速通版!语义通信基础与前沿学习计划】

🧠语义通信基础与前沿学习计划

dally2的博客 1412

07RK3568 I2S主模式 FPGA

RK3568与fpga通过i2s0连接,fpga连接音频芯片ES8388,RK为i2s主模式。调试时发现可正常采集来自fpga的数据。不可发送数据至fpga。由于i2s后连接fpga这里用了Rockchip的dummy-codec,一个虚拟的编解码器。

qq_39451352的博客 302

C++11 移动语义move和forward完美转发实验

最近看了《EffectiveMordenC++》,把C++11移动语义及相关内容简单了梳理了一下,并用代码进行了测试。 欢迎感兴趣的同行一起交流。 #include <vector> #include <testngpp/testngpp.hpp> using namespace std; namespace { // 传入左值时,会走这个重载函数 template<typename T> const char* get_type(..

sinojelly的专栏 479

基于Python实现身份证信息识别

身份证是一种重要的证件,包含了个人的基本信息,如姓名、性别、出生日期、住址等。在实际应用中,有时需要对身份证进行自动化的识别,以提高工作效率和准确性。本文将介绍如何使用Python实现身份证信息的识别,通过图像预处理、OCR技术和解析算法,实现对身份证号码和其他信息的提取和解析。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 1万+

【C++】面试基础搬运

类型和安全检查不同宏定义是字符替换,没有数据类型的区别,同时这种替换没有类型安全检查,可能产生边际效应等错误;const常量是常量的声明,有类型区别,需要在编译阶段进行类型检查编译器处理不同宏定义是一个"编译时"概念,在预处理阶段展开,不能对宏定义进行调试,生命周期结束与编译时期;const常量是一个"运行时"概念,在程序运行使用,放在内存中的data段中。存储方式不同宏定义是直接替换,不会分配内存,存储于程序的代码段中;const常量需要进行内存分配,存储于程序的数据段中是否可以做函数参数。

allensu374125056的博客 763

SpringBoot实战教程-springboot概论

Spring Boot 是一个快速开发框架,能够快速的整合第三方框架,简化XML配置,全部采用注解形式,以及自动配置。内置web容器,帮助开发者能够实现快速开发,简化了应用系统的初始搭建以及开发过程。

鸟哥哥的专栏 4155

《C++等级认证CCF-GESP真题解析》专栏总目录

❤️ 专栏名称:《C++等级认证CCF-GESP真题解析》🌸 专栏介绍:中国计算机学会GESP《CCF编程能力等级认证》C++编程(1~8级)历届真题解析。🚀 订阅专栏:订阅后可阅读专栏内所有真题解析,真题持续更新中,欢迎订阅!

人生就是一个不断学习的过程 6287

C++ 11 左值,右值,左值引用,右值引用,std::move, std::foward

C++11, 右值引用,move, forward

随便记点东西 2万+

7、布尔网络的基础定义

本文介绍了布尔网络的基础定义及其在系统生物学中的应用。布尔网络是一种描述复杂系统动态行为的数学模型,由布尔变量和布尔函数组成,能够模拟生物系统中基因调控、信号传导和细胞代谢等过程。文章详细阐述了布尔网络的基本结构、动力学特征(如状态转移图和吸引子),以及其在生物建模中的重要价值,并探讨了优化和简化技术(如Backward Boolean Equivalence)如何提升其计算效率。

yhn45678901的博客 262

C++11 左值、右值、右值引用详解

左值、右值在C++11中所有的值必属于左值、右值两者之一,右值又可以细分为纯右值、将亡值。在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值(将亡值或纯右值)。

Hyman's Blog 4万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【C++】对左值引用&右值引用&&的深入理解(右值引用与移动语义)

在区分左右值引用之前,我先补充一下对引用的理解。引用,我们需要了解的是,为什么C语言没有引用,而C++有呢?在C语言中,设计者希望语言保持简单并且支持直接操作内存,因此选择使用指针完成数据的传递,通过指针,C语言可以实现对变量的直接访问和修改;在C++中,引入了更高级抽象机制,引用作为一种高级抽象比指针更安全、易用,并且在实现参数传递和返回值时不需要&、*操作符,更符合直观语义,便于面向对象编程。

谁在夜里看海.的博客 8696

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【C++11】深入理解与应用右值引用

区分右值还是左值的关键在于是否可以取地址,对于左值的引用是左值引用,右值的引用是右值引用,它们都是给对象取别名。const左值引用可以引用右值,右值引用可以引用move后的左值;右值一般是临时对象,是将亡值,所以我们就可以在类中专门写一个供右值对象使用的拷贝构造和赋值重载函数,来置换它们的资源,从而减少不必要的深拷贝,我们将这两个函数称为移动构造和移动赋值。

Renswc的博客 1570

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

深入理解(&)左值引用和(&&)右值引用

左值与右值 左值是指既能出现在等号左边也能出现在等号右边的变量(或表达式),右值则只能出现在等号右边 返回左值引用的函数,连同赋值、下标、解引用和前置递增/递减运算符,都是返回左值的表达式 返回非引用类型/右值引用的函数,连同算术、关系、位以及后置递增/递减运算符,都返回右值的表达式 左值持久,右值短暂,左值有持久的状态,而右值要么是字面常量,要么是在表达式求值过程中创建的临时对象(将要被销毁的对象)。 引用 引用是给一个存在的对象定义的别名,一个变量可以有多个引用,引用必须初始化,引用只能在初始化

Jiangtagong的博客 8161

C++ 右值引用

C++

qwert55kai的博客 3261

【C++入门到精通】右值引用 | 完美转发 C++11 [ C++入门 ]

本文涵盖了C++中左值和右值的概念,以及左值引用和右值引用的含义和区别。文章介绍了`move()`函数的作用,以及左值引用和右值引用的比较。同时,文章探讨了右值引用在实际编程中的使用场景和意义,以及完美转发和`std::forward`函数的概念和实际应用场景。本文将帮助读者全面理解C++中与左值和右值相关的概念,以及如何利用右值引用和完美转发来提高代码效率和性能。

Yawesh的博客 824

C++:彻底理解左值和右值(从概念到实践,基础版)

左值(locator value)表示在内存中有确定地址可以被取地址 (&)的对象。换句话说:左值是有名字、能被赋值的东西。右值是没有明确内存地址的临时对象或字面值。它通常出现在赋值号的右侧,用来给左值赋值。

Ethan_Rich的博客 2605

【重学C++】【引用】一文看懂引用的本质与右值引用存在的意义

本文我们深入理解了引用的本质,以及学习了左值和右值的概念,还有右值引用存在的意义。对于左值和右值,我认为不需要去特别的区分,这是编译器的工作。我们更多需要做的,是

同学小张的博客 1523

C++ 右值引用深入理解:特性、优化与底层

在 C++ 中,左右值的区分对于理解语言的行为至关重要。一般来说,可以取地址的是左值,不可以取地址的是右值。同时,被const修饰的通常也被视为左值。10。

microlovw的博客 1410

【重学C++】【引用】深入理解:右值引用(将亡值) 与 移动语义std::move

C++11提供了移动语义,来将左值转换成右值,告诉编译器,对于该变量可以使用移动操作,而非拷贝操作。本文就来看一看C++11提供的移动语义的原理与使用细节。

同学小张的博客 1361

C++的左值和右值

在C++编程中,理解左值(lvalue)和右值(rvalue)是掌握语言精髓的关键。左值表示的是在内存中有固定地址的对象,可以取地址操作,而右值则通常是一些临时对象,无法直接取地址。在实际开发中,左值和右值的区分不仅影响变量的赋值和操作,更直接关系到程序性能优化,比如移动语义和右值引用的应用。通过深入理解这一概念,你将更高效地编写C++代码,充分利用现代C++的特性。

weixin_44259499的博客 1241

【深入理解C++】左值引用、const引用、右值引用、std::move()函数

1.左值引用 2.const引用 2.1 const引用可以指向临时数据 2.2 const引用可以指向不同类型的数据 2.3 const引用作为函数参数 3.右值引用 4.std::move()函数

脚踏实地,仰望星空 3030

深入理解C++中的左值与右值

本文深入解析了C++中左值与右值的概念及其演进。左值代表具名、可修改且持久存在的对象,而右值则是临时、不可修改且即将销毁的表达式。随着C++11引入移动语义,右值细分为纯右值(prvalue)和将亡值(xvalue)。左值引用(&)绑定左值,右值引用(&&)则专门处理临时对象,实现高效的资源转移。移动语义通过移动构造函数和移动赋值运算符优化性能,避免不必要的深拷贝。理解这些概念是掌握现代C++特性(如完美转发)的基础,对提升代码效率和资源管理至关重要。

qq_39980997的博客 881
上一篇: C++左值、右值你分清了吗
下一篇: Wireshark 显示过滤实战技巧:快速锁定你要的包
Linux在秋名山
博客等级 码龄9年 225粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux在秋名山

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值