【问题标题】:How the private and public variables in cpp are distinguished at machine level using the executable file?如何使用可执行文件在机器级别区分 cpp 中的私有和公共变量?
【发布时间】:2018-01-12 07:05:04
【问题描述】:

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

【问题讨论】:

  • 没有。没有办法在运行时问“这个变量是私有的还是公有的”,所以有这样的机制是没有意义的。
  • public/protected/private 仅在编译时存在。
  • 变量只存在于编译时。

标签: c++ processor


【解决方案1】:

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

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

这里有两个很大的误解;首先,他们需要可以通过地址访问,甚至是“从外部”,否则一个类无法向其客户提供对其私有字段的引用(此外,还不清楚内联如何工作).1

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

毕竟,如果我真的想访问某个库的私有数据,我可以只编辑标题并添加friend 声明,或者做一个#define private public,或者(use some template trickeryaccess it legally


  1. 请注意,这只是我想到的第一个也是最明显的例子。即使您可以设计一种机制来跟踪从类的“内部”获得的地址(这会给指针的语义带来很多其他问题),标准的彻底要求任何T * 都可以安全地转换为@ 987654326@ 并读取为sizeof(T) unsigned char 的数组(请参阅 C++11 §1.7 ¶1、§3.9 ¶4、§3.10 ¶10),这样就为这种保护机制敲响了警钟.

【讨论】:

    猜你喜欢
    • 2011-05-25
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 2017-12-19
    • 2017-02-10
    • 2011-05-25
    • 1970-01-01
    • 2011-12-03
    相关资源
    最近更新 更多