左值

#include<stdio.h>
#include<stdlib.h>

void main1()
{
	int num = 5;						//能放在赋值号左边进行赋值的值就是左值
	const int number = 6;

	int *pnum = #					//指针(变量)是一个左值
	int *const pnumber = &number;		//pnumber是一个指针常量,必须在定义的时候初始化才能使用
	//pnumber = #
	//pnum = &number;

	system("pause");
}

### 关于 C++ 中、右以及引用的定义和使用场景 #### 什么是 (lvalue)? 在 C++ 中,是指具有持久存储地址的对象或实体。它可以在程序运行期间被多次访问,并可以作为赋操作的目标。通常情况下,变量名本身就是一个。 例如,在下面的例子中 `a` 是一个: ```cpp int a = 10; ``` 这里 `a` 表示的是内存中的某个位置,可以通过其名称反复访问[^1]。 #### 如何定义引用? 引用通过 `&` 符号来声明,它可以绑定到上而不能直接绑定到右上。例如: ```cpp int a = 10; int& ref_a = a; // 正确:ref_a 绑定到了 a 上。 // int& ref_b = 10; // 错误:10 是右,无法绑定到非 const 的引用。 ``` 如果希望让引用能够绑定到右,则需要将其声明为常量引用 (`const T&`),这样既可以绑定到也可以绑定到右。 #### 什么是右 (rvalue)? 右指的是临时对象或者字面量,它们通常是短暂存在的表达式结果。比如数常量、返回的新创建对象等都属于此类别。 例子如下所示: ```cpp double dValue = 3.14 * 2; // 这里的 '3.14*2' 结果即为 rvalue. auto tempObj = SomeClass(); // 构造出来的实例也是 rvalue. ``` 得注意的一点是当我们将某些原本可能是 lvalues 转化成 movable states 后也会成为所谓的 prvalues(postfix expressions yielding temporary objects)[^2]. #### 右引用是什么? 右引用由两个连续的 && 符号表示, 主要用于支持移动语义(move semantics),允许我们区分对待那些即将销毁不再使用的资源从而实现更高效的数据转移而不是复制. 形式如下: ```cpp SomeType&& rvalRef = getTemporaryObject(); ``` 上述代码片段里,rvalRef 即是对右侧产生的临时 object 建立的一个 alias 名称[^2]. #### 使用场景分析 - **性能优化**: 当处理大型数据结构时(如容器vector,string),利用 move constructor 和 assignment operator 来代替 copy 版本能显著减少不必要的开销; - **完美转发(perfect forwarding)**: 在模板编程领域借助 std::forward 实现参数类型的保留传递至另一层函数调用链路之中保持原始特性不变[^3]. 以下是展示如何运用这些概念构建高效的类成员初始化过程样例: ```cpp class MyClass { public: vector<int> data; // Copy Constructor MyClass(const vector<int>& vec):data(vec){} // Move Constructor MyClass(vector<int>&& vec) noexcept :data(std::move(vec)){} }; MyClass objA({1,2,3}); // Calls the move ctor since {} creates an rvalue. vector<int> v{7,8}; MyClass objB(v); // Invokes copy ctor because 'v' is an lvalue here. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值