如果你的意思是实例的私有成员,那么在运行时没有任何保护.所有的保护都是在编译时进行的,如果你知道如何布置在内存中,你可以随时获得一个类的私人成员.这需要平台和编译器的知识,并且在某些情况下甚至可能依赖于编译器设置,如优化级别.
例如,在我的Linux / x86-64 w / GCC 4.6中,以下程序打印出您期望的内容.这绝对不是便携式的,并且可能会在异乎寻常的编译器上打印意外的事情,但即使是那些编译器也会有自己的具体方式来访问私人成员.
#include
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(static_cast(&fc));
std::cout << p[0] << p[1] << p[2] << p[3] << std::endl;
}
(复杂的演员在那里,因为void *是任何指针可以被转换的唯一类型,然后可以将void *转换为char *而不调用strict aliasing rule.在实践中也可能使用单个reinterpret_cast我从来不玩这种肮脏的技巧,所以我不太熟悉如何以最快的方式做到这一点:)