据我所知,c ++类中的非静态数据成员被打包成C风格的结构。为了简化讨论,忽略虚函数和继承,如何在这样的方案中强制执行访问说明符?
说一节课:
class Object
{
public:
int i1;
int i2;
private:
char i3;
int i4;
};
转换为:
struct {
int i1;
int i2;
char i3;
int i4;
}
c ++如何确保私有成员i3和i4无法在课外访问,但i1和i2可以?
答案 0 :(得分:4)
C ++有(某些)安全卫士来防范墨菲,而不是马基雅维利。
这意味着const
,volatile
和访问限定符在编译时检查 ,但即便如此也可以绕过(使用各种技巧)
所以...... C ++不需要实现保护方案。如果程序编译,则认为是正确的(与那些限定符一样)并且将在没有运行时检查的情况下执行。
答案 1 :(得分:3)
没有。来吧,做一个reinterpret_cast
并手动索引指针。这也是因为C和C ++都允许抛弃const
。
然而,一般来说,这样做是一个愚蠢的想法,C ++通过在正常访问时简单地检查修饰符来有效地强制执行访问修饰符。
答案 2 :(得分:1)
C ++是一种静态类型语言。类似地,C ++中的许多概念也是静态检查的。具体来说,访问说明符是在编译时检查的。
该标准给出了关于如何将类成员放在内存中的一些保证。最有用的是在同一访问说明符部分中一起指定的成员将按指定的顺序提供。 (例如,这种特性对于访问网络数据包非常有用。)
要回答你的问题,结构没有“翻译”(结构是一个简并类,默认访问是公共的而不是私有的)。访问说明符在编译时强制执行。没有运行时强制访问说明符。
答案 3 :(得分:0)
你的来源是什么?我认为它指的是对象在内存中的表示方式,但它是处理访问说明符的编译器,而不是运行时。
在内存中,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;
};