如何使用可执行文件在机器级别区分 cpp 中的私有和公共变量?

How the private and public variables in cpp are distinguished at machine level using the executable file?

本文关键字:变量 cpp 可执行文件 何使用 机器 别区      更新时间:2023-10-16

我们都对 C++ 中的私有和公共变量有所了解。是否有任何机制可以在机器级别区分私有和公共成员? 如果数据成员可以通过使用成员的地址来访问,那么为什么要在C ++编程中使用私有和公共。

>C++中的私有和公共完全是编译时概念;它们在运行时不会以任何方式强制执行。类及其语义只是告诉编译器以某种方式将数据放在内存中的蓝图;在运行时,只有字节的数据和代码通过一些给定的偏移量访问它们。

如果数据成员可以通过使用成员的地址来访问,那么为什么要在C ++编程中使用私有和公共。

这里有两个很大的误解;首先,它们需要通过地址访问,即使是"从外部",否则类无法向其客户提供对其私有字段的引用(此外,不清楚内联将如何工作)。1

但最重要的是,C++访问控制不是安全问题。私有和公共的重点是建立接口和实现细节的分离(从而帮助客户端不要将对象置于逻辑不一致的状态,或者依赖于可能会更改的实现细节),而不是使不受信任的代码无法访问数据;源代码中的代码(甚至只是在进程中运行)被假定为不是敌对的。

毕竟,如果我真的想访问某个库的私人数据,我可以编辑标题并添加friend声明,或者做一个#define private public,或者(使用一些模板技巧来合法访问它。


  1. 请注意,这只是想到的第一个也是最明显的例子。即使你可以设计一种机制来跟踪从类的"内部"获得的地址(这会给指针的语义带来很多其他问题),标准的彻头彻尾的要求,任何T *都可以安全地转换为unsigned char *并作为sizeof(T)unsigned char数组读取(参见C++11 §1.7 ¶1, §3.9 ¶4, §3.10 ¶10),这样就把棺材里的钉子钉在了这种保护机制上。