[原创](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++中, 左值(Lvalue)是一个基础且至关重要的概念, 它不仅仅是历史遗留概念, 它在语言的内存管理、对象生命周期以及引用绑定等方面都扮演着重要角色, 它是理解引用、移动语义以及许多高级特性的基石.
[左值(Lvalue,"locator value")]
1. 定义: 表示一个可以被定位(located)的值, 即它关联到一个特定的内存地址. 在C++中, 凡是能够通过地址运算符&找到内存位置的实体, 通常都被认为是左值.
2. 特征:
* 可以取地址: 可以使用&运算符获取左值的内存地址
* 可以出现在赋值号(=)的左边: 大多数左值都可以被赋值(const 左值除外), 这是“左值”名称的历史来源, 但并非现代定义的核心.
* 持久性: 左值所代表的对象或函数在其作用域内持续存在, 不会在表达式计算完毕后立即消失.
[代码演示]
struct STRUCT_DEMO {
int int_Data;
};
// 函数名fun_getValue是一个左值
// 原因: 函数名本身是指向函数代码段的指针, 具有固定的内存地址
int fun_getValue() {
return 5;
}
int main() {
// int_Demo 是左值, 因为:
// 1. int_Demo 可以出现在赋值号 (=) 的左边.
// 2. 可以使用 & 运算符获取 int_Demo 的内存地址.
int int_Demo = 88;
// array_Int 是左值, 具体原因如下:
// 1. array_Int 作为数组变量, 在内存中有固定地址.
// 2. array_Int 可以出现在赋值号 (=) 的左边.
// 3. 可以使用 & 运算符获取 array_Int 的地址.
int array_Int[5];
// array_Int[0] 是左值, 因为:
// 1. array_Int[0] 对应数组中的一个具体元素, 存储在固定内存中.
// 2. 可以出现在赋值号 (=) 的左边.
// 3. 可以使用 & 运算符获取 array_Int[0] 的地址.
array_Int[0] = 1;
// pint_Demo 是左值, 因为:
// 1. pint_Demo 是一个指针变量, 指向 int_Demo 的内存地址.
// 2. 指针变量可以在赋值号 (=) 的左边出现, 并且可以取地址.
int* pint_Demo = &int_Demo;
// struct_Demo 和 struct_Demo.int_Data 都是左值, 原因如下:
// 1. struct_Demo 是结构体变量, 在内存中占有一块连续区域.
// 2. 可以对 struct_Demo 进行赋值操作, 也可以对其成员进行赋值.
STRUCT_DEMO struct_Demo;
struct_Demo.int_Data = 1;
return 0;
}
[代码说明]
* 变量 (如 int_Demo) 和数组 (如 array_Int)
这些对象在定义时被分配了固定的内存空间, 所以能够出现在赋值号的左边, 同时也可以对它们取地址.
* 数组元素 (如 array_Int[0])
作为数组的一部分, 数组元素具有固定的内存位置, 这使得它们能够作为左值使用, 允许赋值以及地址运算.
* 指针 (如 pint_Demo)
指针变量本身也是左值, 因为它们存储在内存中, 并且可以通过取地址操作访问其自身的地址.
* 结构体对象及其成员 (如 struct_Demo 和 struct_Demo.int_Data)
结构体变量同样拥有固定内存空间, 结构体成员作为对象的一部分也具有左值特性, 能够被赋值和取地址.
* 函数名fun_getValue
函数名fun_getValue是一个左值, 因为它是指向函数代码段的指针, 具有固定的内存地址, 可以通过&fun_getValue获取
[总结]
左值是现代C++中的核心概念之一, 它代表了可以被定位到特定内存地址的值. 可以总结左值的几个关键点:
* 地址性: 左值可以通过&运算符获取其内存地址, 这是其最本质的特征.
* 可赋值性: 大多数左值可以出现在赋值号的左侧(常量左值除外), 这是其名称的历史来源.
* 持久性: 左值在其作用域内持续存在, 不会因表达式结束而消失.
通过代码示例, 看到变量、数组、指针、结构体成员甚至函数名都可以是左值, 只要它们满足上述特征. 理解左值不仅有助于正确使用C++的基本语法, 还是深入学习引用、移动语义和资源管理等高级特性的基础.