c/c++中的lvaues(左值)和rvalues(右值)

本文深入探讨了C/C++中的左值(lvalues)和右值(rvalues),包括它们的定义、区别以及在实际编程中的应用。lvalues代表内存区域,分为可修改和不可修改两种,而rvalues则是除lvalues之外的对象或表达式,通常无法表示内存区域。文中通过实例解释了lvalues和rvalues在字面常量、临时对象、数组名称、函数返回值等方面的应用,并讨论了它们之间的转换规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.1        写在开头

也许有朋友看到这个介绍,会一笑而过。认为,Lvaues不就是,出现在赋值运算符“=”左边的表达式么,相应的rvalues不就是出现在赋值运算符“=”右边的部分么,这有啥难的呢?

hand一下!其实在写这篇文章之前,我和你的想法一样。平时看资料,调试代码的时候,经常遇到lvaues和rvalues这两个词。并且每次看到都认为是很简单,不重要的东西,所以都略过,更谈不上深究。但,老是感觉很别扭,既然这么简单的东西,为什么在技术资料中作为术语呢?并且编译器报错,也提到这两个词呢?

今天找了一些资料,仔细学习了一下,才知道,之前的理解也是没有错。不过,仅仅是表面文字理解,没有抓住本质而已。

1.2        定义

Ø  lvaues本质“就是指一些对象、或者是表达式。这些对象、表达式必须代表一块内存区域”。换句话说,lvaues就是代表一块内存区域的对象(object)或者是表达式(expression)。

Ø  Lvaues,有“可修改”和“不可修改”之分。

例如:

可修改的lvaues:

Int *p;

Int n;

std::string& student_name();

 

不可修改的lvaues(一般都是常量对象):

const std::stringname;

 

Ø  rvalues 被定义为“除了lvaues以为的所有对象、或者表达式”。其实,本质是“不能表示一块内存区域”。

总结:

### C++左值引用引用的概念及区别 #### 左值引用 (lvalue reference) 左值引用表示的是对象的身份,即它指向内存中的某个位置。左值引用可以绑定到变量或具有持久存储的对象上。对于非常量左值引用 `T&` 常量左值引用 `const T&` 的特性如下: - 非常量左值引用 (`T&`) 只能绑定到左值,并且可以通过该引用改变所指对象的内容。 - 常量左值引用 (`const T&`) 则既可以绑定到左值也可以绑定到,但是不允许通过此引用来修改被引用的数据。 ```cpp int a = 10; int &ref_a = a; // 绑定到左值 'a' // int &ref_b = 5; // 错误:不能将临时绑定到非常量左值引用 ``` #### 引用 (rvalue reference)C++11 起引入了引用这一概念,形式为 `T&&`。引用主要用于捕获那些即将销毁的资源(通常是临时对象),以便利用这些资源而无需创建额外副本,进而提高程序效率。具体来说: - 非常量引用 (`T&&`) 主要应用于移动语义与完美转发之中; - 对于常量引用 (`const T&&`) 实际应用较少见,因为通常不需要对一个只读的临时对象做任何改动。 ```cpp std::string s1 = "hello"; std::string &&s2 = std::move(s1); // 将 's1' 标记为可转移状态并绑定给引用 's2' void func(std::string&& str){ // 处理参数... } func("world"); // 字符串字面量作为临时对象传递给接受引用形参的函数 ``` --- ### 使用场景分析 当涉及到复杂的对象如容器、字符串等时,使用引用能够显著减少不必要的深拷贝开销,在某些情况下甚至可以直接接管原有资源的所有权而不必复制数据本身。这不仅提高了运行速度还降低了内存消耗[^1]。 此外,引用配合模板技术实现了所谓的“完美转发”,使得泛型编程更加灵活高效;而对于简单内置类型的处理,则没有必要刻意区分左引用,因为这类类型的操作成本较低,优化空间有限[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值