当前位置: 首页 > news >正文

[原创](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++的基本语法, 还是深入学习引用、移动语义和资源管理等高级特性的基础.

http://www.dtcms.com/a/109423.html

相关文章:

  • 运维之 Centos7 防火墙(CentOS 7 Firewall for Operations and Maintenance)
  • 17、Swift框架微调实战(2)-QWQ-32B LORA微调cot数据集
  • 加密解密工具箱 - 专业的在线加密解密工具
  • 19-元素显示模式及浮动(CSS3)
  • 3D模型给可视化大屏带来了哪些创新,都涉及到哪些技术栈。
  • c#递规获取指定目录下的所有文件
  • C++Cherno 学习笔记day15 [57]-[60] 静态数组、函数指针、lambda、using namespace std
  • DataX实战教程
  • 【性能优化点滴】odygrd/quill在编译期做了哪些优化
  • AI辅助开发插件
  • PMP中,资源平衡和资源平滑的区别
  • CentOS Linux升级内核kernel方法
  • JSON 对象
  • 【C++11】lambda表达式 可变参数模板 移动构造与移动赋值 包装器
  • 厄瓜多尔主流收单方式:Pago Efectivo支付
  • 【Linux】进程信号的捕捉处理
  • 镜片防雾性能测试仪在自动驾驶与无人机领域的创新应用
  • 虚拟试衣间微信小程序解决方案
  • CSRF跨站请求伪造——入门篇【DVWA靶场low级别writeup】
  • Android学习总结之handler源码级
  • Reactive编程入门:Project Reactor 深度指南
  • 网络:华为数通HCIA学习:IP路由基础
  • vuex自存例子
  • linux_sysctl_fs_file_nr监控项
  • LeetCode刷题 -- 48. 旋转图像
  • 2025身份证号码前六位地区代码对照表
  • Android A/B 分区 OTA 如何查看升级的 img 分区
  • zk基础—4.zk实现分布式功能二
  • Ansible:playbook的高级用法
  • Unity中 JobSystem使用整理