【问题标题】:c++ implementation of access specifiers访问说明符的c++实现
【发布时间】:2012-06-11 06:46:45
【问题描述】:

据我了解,C++ 类中的非静态数据成员被打包到 C 风格的结构中。为了简化讨论而忽略虚函数和继承,在这种方案中如何强制执行访问说明符?

说一堂课:

class Object
    {
public:
    int i1;
    int i2;
private:
    char i3;
    int i4;
    };

翻译为:

struct { 
  int i1;
  int i2;
  char i3;
  int i4;
}

c++如何保证私有成员i3i4不能在类外访问而i1i2可以?

【问题讨论】:

  • 谁说class 定义转换为struct 定义(您定义它们的方式)?
  • 再次从网上阅读资料,这是我理解大多数编译器所做的。我可能错了。
  • 请注意,这种“翻译”为结构并不是唯一可能的。

标签: c++ oop


【解决方案1】:

C++ 有(一些)安全措施来防止墨菲,而不是马基雅维利。

这意味着constvolatile 和访问限定符在编译时被检查,但即便如此也可以绕过(使用各种技巧)。

所以... C++ 不需要实施 保护方案。如果程序已编译,则认为它是正确的(使用那些限定符)并且将在没有运行时检查的情况下执行。

【讨论】:

    【解决方案2】:

    它没有。继续,执行reinterpret_cast 并手动索引指针。这与 C 和 C++ 都允许丢弃 const 的原因相同。

    但是,一般来说,这样做是一个愚蠢的想法,而 C++ 通过在您以正常方式访问时简单地检查修饰符来有效地强制执行访问修饰符。

    【讨论】:

    • 取消引用 reinterpret_cast 将导致未定义的行为。
    【解决方案3】:

    C++ 是一种静态类型语言。同样,C++ 中的许多概念也是静态检查的。具体来说,访问说明符在编译时进行检查。

    该标准提供了一些关于类成员在内存中的布局方式的保证。最有用的是在同一访问说明符部分中一起指定的成员将按指定的顺序可用。 (这个特性对于例如访问网络数据包非常有用。)

    要回答您的问题,没有对结构的“翻译”(结构是退化的类,其中默认访问是公共的而不是私有的)。访问说明符在编译时强制执行。访问说明符没有运行时强制执行。

    【讨论】:

      【解决方案4】:

      你的来源是什么?我认为它指的是对象在内存中的表示方式,但处理访问说明符的是编译器,而不是运行时。

      在内存中,class 可能看起来与 struct 相同,但对编译器来说却不是。

      此外,即使在内存中,两者也不必等价(就像它们对于编译器不等价一样)。编译器可以重新排列成员,只要它将那些没有交错访问说明符的成员组合在一起。所以,在记忆中,

      class Object {  
      public: 
         int i1; 
         int i2; 
      private: 
         char i3; 
         int i4; 
      };
      

      理论上可以表示为

      struct {
         char i3;
         int i4;
         int i1;
         int i2;
      }
      

      请注意,我在这里只讨论内存布局。 实际 struct 相当于您的课程:

      struct Object {  
      private:
      public: 
         int i1; 
         int i2; 
      private: 
         char i3; 
         int i4; 
      };
      

      【讨论】:

      • 只是一点点(或语言更正):该标准不保证将具有相同访问级别的那些分组在一起,它保证那些没有干预访问说明符组合在一起。如果您在每个声明前放置一个访问说明符,编译器可以随意重新排序(读者会假设您是一个不太了解 C++ 的 Java 程序员:-))。
      • 还值得指出的是,访问控制仅适用于通过名称进行的访问。如果Object类有一个公共函数int& ref4() { return i4; },非成员可以通过它访问i4,即使i4是私有的。
      • @JamesKanze 好吧,如果他不知道,那么一个 SO 答案就无法弥补他的大部分空白......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-17
      • 2018-01-30
      • 2012-06-05
      • 2011-04-16
      • 2011-01-31
      • 1970-01-01
      • 2016-06-16
      相关资源
      最近更新 更多