如何使用可执行文件在机器级别区分 cpp 中的 private 和 public 变量?
How the private and public variables in cpp are distinguished at machine level using the executable file?
我们都对 C++ 中的私有变量和 public 变量有所了解。是否有任何机制可以在机器级别区分私有成员和 public 成员?
如果数据成员可以通过使用成员的地址访问,那么为什么在 C++ 编程中使用私有和 public。
C++中的private和public完全是compile-time概念;它们在运行时不会以任何方式强制执行。 类 及其语义只是告诉编译器以某种方式将数据放置在内存中的蓝图;在运行时,只有字节的数据和代码可以使用一些给定的偏移量访问它们。
If the data members are accessible by using the addresses of the members then why to use the private and public in c++ programming.
这里有两个很大的误解;首先,它们 需要 甚至可以通过地址 "from the outside" 访问,否则 class 无法向其客户提供对其私有字段的引用(另外,目前还不清楚内联是如何工作的。1
但最重要的是,C++ 访问控制 而不是 安全问题。 private 和 public 的要点是建立接口和实现细节的分离(从而帮助客户不要将 object 置于逻辑上不一致的状态,或者依赖可能发生变化的实现细节) , 不要让不受信任的代码无法访问数据;您源代码中的代码(甚至只是您过程中的 运行)被假定为没有敌意。
毕竟,如果我真的想访问某个库的私有数据,我可以只编辑 header 并添加一个 friend
声明,或者做一个 #define private public
,或者 ( use some template trickery to access it legally.
- 请注意,这只是第一个也是最明显的例子。即使您可以设计一种机制来跟踪从 class 的 "the inside" 获得的地址(这将对指针的语义造成许多其他问题),标准完全强制要求任何
T *
可以安全地转换为 unsigned char *
并作为 sizeof(T)
unsigned char
的数组读取(参见 C++11 §1.7 ¶1、§3.9 ¶4、§3.10 ¶10),因此这给这种保护机制敲了棺材里的钉子。
我们都对 C++ 中的私有变量和 public 变量有所了解。是否有任何机制可以在机器级别区分私有成员和 public 成员? 如果数据成员可以通过使用成员的地址访问,那么为什么在 C++ 编程中使用私有和 public。
private和public完全是compile-time概念;它们在运行时不会以任何方式强制执行。 类 及其语义只是告诉编译器以某种方式将数据放置在内存中的蓝图;在运行时,只有字节的数据和代码可以使用一些给定的偏移量访问它们。
If the data members are accessible by using the addresses of the members then why to use the private and public in c++ programming.
这里有两个很大的误解;首先,它们 需要 甚至可以通过地址 "from the outside" 访问,否则 class 无法向其客户提供对其私有字段的引用(另外,目前还不清楚内联是如何工作的。1
但最重要的是,C++ 访问控制 而不是 安全问题。 private 和 public 的要点是建立接口和实现细节的分离(从而帮助客户不要将 object 置于逻辑上不一致的状态,或者依赖可能发生变化的实现细节) , 不要让不受信任的代码无法访问数据;您源代码中的代码(甚至只是您过程中的 运行)被假定为没有敌意。
毕竟,如果我真的想访问某个库的私有数据,我可以只编辑 header 并添加一个 friend
声明,或者做一个 #define private public
,或者 ( use some template trickery to access it legally.
- 请注意,这只是第一个也是最明显的例子。即使您可以设计一种机制来跟踪从 class 的 "the inside" 获得的地址(这将对指针的语义造成许多其他问题),标准完全强制要求任何
T *
可以安全地转换为unsigned char *
并作为sizeof(T)
unsigned char
的数组读取(参见 C++11 §1.7 ¶1、§3.9 ¶4、§3.10 ¶10),因此这给这种保护机制敲了棺材里的钉子。