C++ 左值、右值、左值引用、右值引用
C 左值、右值、左值引用、右值引用大家好我是你们的技术博主。今天我们来聊聊C中一个让很多初学者头疼但又是进阶必备的概念左值、右值、左值引用和右值引用。别被这些术语吓到我会用最通俗的语言配上可运行的代码帮你一次搞懂。## 一、什么是左值和右值在C中左值lvalue和右值rvalue是根据对象的持久性和可寻址性来区分的。-左值可以取地址的对象通常有名字可以出现在赋值语句的左边。比如变量、数组元素、函数返回的引用等。-右值临时对象不能取地址通常只能出现在赋值语句的右边。比如字面常量3.14、表达式的结果ab、函数返回的非引用值等。用一句话总结左值有持久的内存位置右值是临时的“过客”。### 示例代码1区分左值和右值cpp#include iostreamusing namespace std;int main() { int a 10; // a是左值10是右值字面常量 int b 20; // b是左值 int c a b; // ab的结果是右值临时值 // 错误示例右值不能取地址 // int* p (10); // 编译错误不能对右值取地址 // int* q (a b); // 编译错误不能对临时结果取地址 // 正确示例左值可以取地址 int* p a; // 合法a是左值 cout a的地址: p endl; // 左值可以被赋值 a 100; // 合法a是左值 // 10 a; // 错误10是右值不能出现在左边 cout a的新值: a endl; cout a b的结果右值: a b endl; return 0;}运行结果a的地址: 0x7ffeefbff5a0a的新值: 100a b的结果右值: 120## 二、左值引用左值引用就是绑定到左值的引用。我们平时用的最多的引用类型就是左值引用用表示。### 左值引用的特点- 必须绑定到左值有名字的变量- 不能绑定到右值临时对象- 引用是原变量的别名修改引用会改变原变量### 示例代码2左值引用cpp#include iostreamusing namespace std;int main() { int x 42; // x是左值 int ref x; // ref是左值引用绑定到x cout x x endl; cout ref ref endl; ref 100; // 通过引用修改x cout 修改ref后x x endl; // 错误示例左值引用不能绑定到右值 // int ref2 42; // 编译错误不能将左值引用绑定到右值 // 常量左值引用可以绑定到右值特殊规则 const int cref 42; // 合法const引用可以绑定到临时对象 cout 常量引用绑定到右值: cref endl; return 0;}运行结果x 42ref 42修改ref后x 100常量引用绑定到右值: 42## 三、右值引用右值引用是C11引入的新特性用表示。它专门用来绑定到右值临时对象。右值引用的出现主要是为了实现移动语义和完美转发。### 右值引用的特点- 只能绑定到右值临时对象- 可以延长临时对象的生命周期- 主要用于移动构造函数和移动赋值运算符### 示例代码3右值引用cpp#include iostream#include stringusing namespace std;void processValue(int val) { cout 左值引用版本val val endl;}void processValue(int val) { cout 右值引用版本val val endl;}int main() { int a 10; int b 20; processValue(a); // 调用左值引用版本 processValue(a b); // 调用右值引用版本ab是临时值 processValue(100); // 调用右值引用版本100是字面常量 // 右值引用变量本身是左值 int rref 42; // rref绑定到右值42 // 但rref本身是左值有名字、可寻址 processValue(rref); // 调用左值引用版本因为rref是左值 // 使用std::move可以将左值转为右值 processValue(std::move(a)); // 调用右值引用版本 return 0;}运行结果左值引用版本val 10右值引用版本val 30右值引用版本val 100左值引用版本val 42右值引用版本val 10## 四、为什么需要右值引用右值引用的核心价值在于移动语义。传统的拷贝操作会复制数据而移动操作可以“偷取”临时对象的资源避免不必要的内存拷贝提升性能。### 示例代码4移动语义与拷贝构造cpp#include iostream#include vector#include stringusing namespace std;class MyVector {public: int* data; size_t size; // 构造函数 MyVector(size_t n) : size(n) { data new int[n]; cout 构造函数分配了 n 个整数 endl; } // 拷贝构造函数深拷贝 MyVector(const MyVector other) : size(other.size) { data new int[size]; copy(other.data, other.data size, data); cout 拷贝构造函数深拷贝 size 个整数 endl; } // 移动构造函数偷取资源 MyVector(MyVector other) noexcept : data(other.data), size(other.size) { other.data nullptr; other.size 0; cout 移动构造函数偷取了 size 个整数 endl; } ~MyVector() { delete[] data; cout 析构函数 endl; }};int main() { vectorMyVector vec; cout --- 创建临时对象并插入 --- endl; vec.push_back(MyVector(10)); // 创建临时MyVector然后移动或拷贝 cout \n--- 使用std::move --- endl; MyVector v1(20); vec.push_back(std::move(v1)); // 将左值转为右值触发移动构造 cout \n程序结束 endl; return 0;}运行结果--- 创建临时对象并插入 ---构造函数分配了 10 个整数移动构造函数偷取了 10 个整数析构函数--- 使用std::move ---构造函数分配了 20 个整数移动构造函数偷取了 20 个整数程序结束析构函数析构函数## 五、总结通过本文我们学习了C中左值、右值、左值引用和右值引用的核心概念1.左值有持久内存位置的对象可以取地址通常有名字。2.右值临时对象不能取地址通常是字面常量或表达式结果。3.左值引用绑定到左值的引用用表示不能绑定到右值除了const引用。4.右值引用绑定到右值的引用用表示是C11的新特性用于实现移动语义。右值引用的出现让C程序员能够更精细地控制资源管理通过移动语义避免不必要的拷贝显著提升程序性能。在实际开发中合理使用std::move和移动构造函数可以让你的代码既高效又优雅。记住一句话左值引用绑定到“有家”的对象右值引用绑定到“流浪”的临时对象。理解了这个比喻你就掌握了这些概念的精髓。

相关新闻

Linux硬盘挂载:用UUID解决盘符漂移,实现稳定自动挂载

Linux硬盘挂载:用UUID解决盘符漂移,实现稳定自动挂载

在服务器运维和日常开发中,挂载硬盘是一项基础但至关重要的操作。很多朋友在配置 /etc/fstab 文件时,可能习惯性地使用 /dev/sdb1 这样的设备名,但在生产环境或频繁插拔硬盘的场景下,这往往会导致系统启动失败或数据目录“神秘失踪”。本文将深入探讨这个问题的根源——…

2026/7/25 19:16:31阅读更多 →
为自主开发的 AI Agent 框架配置 Taotoken 作为多模型供应商后端

为自主开发的 AI Agent 框架配置 Taotoken 作为多模型供应商后端

为自主开发的 AI Agent 框架配置 Taotoken 作为多模型供应商后端 在构建自定义的智能体工作流时,一个核心挑战是如何为智能体提供稳定、可靠且灵活的模型调用能力。直接对接单一模型供应商,可能会面临服务波动、模型能力不匹配或成本不可控等问题。通过…

2026/7/25 19:16:31阅读更多 →
计算机I/O控制方式全解析:从程序查询到通道技术

计算机I/O控制方式全解析:从程序查询到通道技术

如果你正在准备计算机组成原理的考试,特别是面对那些看似简单却容易混淆的I/O选择题,这篇文章就是为你准备的。很多同学在复习时容易陷入"背概念"的误区,结果遇到实际题目时还是无从下手。真正的问题不在于记忆,而在于理…

2026/7/25 19:16:31阅读更多 →
Windows 11本地部署GLM-5.2大模型:集成知识库与智能体的低成本实战指南

Windows 11本地部署GLM-5.2大模型:集成知识库与智能体的低成本实战指南

最近在尝试本地部署大语言模型时,很多开发者都被复杂的Linux环境、CUDA配置和动辄数万元的硬件成本劝退。特别是对于希望集成智能体(Agent)和知识库(Claw)功能,实现私有化AI应用的团队或个人来说,门槛显得尤其高。本文将分享一套完全在Windows 11系统上,以极具性价比的…

2026/7/25 20:26:49阅读更多 →
FAISS(Facebook AI Similarity Search)完整入门介绍

FAISS(Facebook AI Similarity Search)完整入门介绍

FAISS(Facebook AI Similarity Search)完整入门介绍一、什么是 FAISSFAISS Facebook AI Similarity Search Meta(原 Facebook)开源的向量相似度检索库,核心用途: 在海量高维向量中快速搜索与目标向量最相似…

2026/7/25 20:26:49阅读更多 →
学习Flutter跨平台移动应用开发与性能优化技巧

学习Flutter跨平台移动应用开发与性能优化技巧

学习Flutter跨平台移动应用开发与性能优化技巧在当今移动应用开发领域,跨平台解决方案已成为提升开发效率、降低成本和加速产品上市的关键。Google推出的Flutter框架,凭借其独特的架构和出色的性能,迅速从众多工具中脱颖而出,成为…

2026/7/25 20:26:49阅读更多 →
Unity Animator状态机驱动2D动画:实现平滑移动、旋转与缩放

Unity Animator状态机驱动2D动画:实现平滑移动、旋转与缩放

1. 项目概述:为什么Animator是2D动画的“导演”而非“放映员”在Unity里做2D精灵动画,很多朋友的第一反应可能是:“这不就是拖几个帧图,用Animation窗口录一下位置和旋转吗?” 确实,早期的Unity 2D动画&…

2026/7/25 20:26:49阅读更多 →
AI 双向赋能网络安全:攻防演化、风险短板与全域智能防御体系构建

AI 双向赋能网络安全:攻防演化、风险短板与全域智能防御体系构建

摘要 生成式 AI 与自主智能体技术同步重塑网络攻击与防御全链路,DeXpose 平台 2026 年行业报告完整呈现 AI 在安全运营、威胁狩猎、暗网情报监测、钓鱼识别领域的落地价值,同时揭露攻击者利用同类 AI 技术规模化发起高仿钓鱼、供应链渗透、凭据窃取的新型…

2026/7/25 20:26:49阅读更多 →
AI智能体开发实战:Nexent平台电商客服搭建指南

AI智能体开发实战:Nexent平台电商客服搭建指南

1. 项目概述:AI智能体开发的新范式最近半年,AI智能体开发正在经历从实验室走向产业化的关键转折。不同于传统的单任务AI模型,智能体具备环境感知、自主决策和持续学习的能力,这使其在客服自动化、流程优化等场景展现出惊人潜力。N…

2026/7/25 20:24:48阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/25 1:01:14阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/25 1:01:14阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/25 1:01:14阅读更多 →
突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的…

2026/7/25 0:01:16阅读更多 →
C++ string类模拟实现:从深拷贝到内存管理的完整指南

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述:为什么我们要“手撕”string类?在C的学习道路上,尤其是从C语言过渡到C的“初阶”阶段,string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了,、find、substr,几个操作符和函数…

2026/7/25 0:01:16阅读更多 →
三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看,“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具,而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源,比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:01:16阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/24 23:01:03阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/25 19:03:04阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/25 19:03:04阅读更多 →