C++ 除了可访问性之外,访问说明符还有什么影响?
除了对派生类可见或不可见的正常解释之外,它们还有其他区别吗C++ 除了可访问性之外,访问说明符还有什么影响?,c++,inheritance,private,public,protected,C++,Inheritance,Private,Public,Protected,除了对派生类可见或不可见的正常解释之外,它们还有其他区别吗 如果使其更可见,它占用的内存是更多还是更少,它是否会减慢速度或…?除了对外部成员或派生类的可访问性之外,访问说明符可能会影响对象布局 引用我的话: 通常,数据成员的内存地址按类中定义的顺序增加。但是在遇到访问说明符(private、protected、public)的任何地方,此顺序都可能被中断。这一点已在Lippman中进行了详细讨论 摘自 编译器不允许这样做 不过,重组本身。这个 标准要求 在相同的公共:、受保护:、或 二等兵:必须
如果使其更可见,它占用的内存是更多还是更少,它是否会减慢速度或…?除了对外部成员或派生类的可访问性之外,访问说明符可能会影响对象布局 引用我的话: 通常,数据成员的内存地址按类中定义的顺序增加。但是在遇到访问说明符(
private
、protected
、public
)的任何地方,此顺序都可能被中断。这一点已在Lippman中进行了详细讨论
摘自
编译器不允许这样做
不过,重组本身。这个
标准要求
在相同的公共:、受保护:、或
二等兵:必须放在那个里
由编译器排序如果你
使用访问权限散布您的数据
不过,说明符是编译器的一部分
允许重新排列
访问说明符分隔的数据块
用于改进布局的数据,即
为什么有些人喜欢设置访问权限
每个数据前面的说明符
成员
有趣,不是吗?来自
n3225
,9.2[class.mem]注15
具有相同访问控制(第11条)的(非联合)类的非静态数据成员被分配,以便后面的成员在类对象中具有更高的地址。未指定具有不同访问控制的非静态数据成员的分配顺序(11)
这意味着,鉴于以下声明:
class Foo {
public: int a;
private: int b;
public: int c;
private: int d;
};
标准仅强制执行以下断言:
Foo foo;
assert(&foo.a < &foo.c);
assert(&foo.b < &foo.d);
实际上,编译器完全忽略(为此目的)说明符是出现一次还是多次,并且每次指定它都是虚假的,并且由于额外的解析,最多会减慢编译速度。对于人类读者来说,这可能更清楚。。。但这是非常主观的。@Nawaz:这有点不正确。我将更详细地回答,因为注释并不适合这样的解释。@Nawaz:给你,我已经从最新版本的C++0X FCD中挖掘出了这段引用。请注意,没有“块”的概念,在每个成员之前重复访问说明符或在声明中散布公共/私有块并不重要。@Nawaz:不幸的是,我没有C++03标准,我现在也不打算付钱:)我怀疑它最近有变,我宁愿认为这段引文构思不周,也不能完美地表达作者的意思。@Nawaz:我的意思是,它可能无法表达作者真正想说的话(另一方面,我们通常不会说“法律术语”,明确且措辞极为谨慎的句子保留在标准文本中)。也可能是作者错了,或者标准改变了,但是由于我没有C++03版本,我们必须等待一个更了解情况的人来:)如果你想说“有什么不同”,那么就说“有什么不同”,而不是“有什么不同”:)无法访问的成员仍然可见。重载是一个很好的例子,因为实际上可以在这里隐藏成员:派生方法隐藏同名的基方法。
class Foo' {
public: int a,c;
private: int b,d;
};