如何在C ++中实现私有变量的访问?

时间:2012-07-14 19:10:44

标签: c++ memory-management private-members data-protection

编译器如何控制内存中变量的保护?是否有与内存中的私有变量相关联的标记位?它是如何工作的?

2 个答案:

答案 0 :(得分:18)

如果您指的是private个实例成员,那么在运行时无论如何都没有任何保护。所有保护都在编译时进行,如果您知道它们如何在内存中布局,您可以随时访问类的私有成员。这需要了解平台和编译器,在某些情况下甚至可能依赖于编译器设置,例如优化级别。

例如,在我的Linux / x86-64 w / GCC 4.6上,以下程序会准确打印出您期望的内容。它绝不是可移植的,可能会在异国情调的编译器上打印出意想不到的东西,但即使是那些编译器也会有自己特定的方式来访问私有成员。

#include <iostream>

class FourChars {
  private:
    char a, b, c, d;

  public:
    FourChars(char a_, char b_, char c_, char d_)
      : a(a_), b(b_), c(c_), d(d_)
    {
    }
};

int main()
{
    FourChars fc('h', 'a', 'c', 'k');

    char const *p = static_cast<char const *>(static_cast<const void *>(&fc));

    std::cout << p[0] << p[1] << p[2] << p[3] << std::endl;
}

(复杂的强制转换是因为void*是唯一可以强制转换为指针的类型。void*可以强制转换为char*而不调用strict aliasing rule也许只有一个reinterpret_cast - 在实践中,我从不玩这种肮脏的技巧,所以我不太熟悉如何以最快的方式做到这一点:)

答案 1 :(得分:3)

编译器的工作是看到某些成员是私有的并且不允许您使用它们。编译后,它们不是任何与其他成员有很大不同。

然而 是一个重要方面,因为数据成员不需要按照它们在类定义中出现的顺序在内存中布局,但它们是变量所必需的具有相同的访问级别。