Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 除了可访问性之外,访问说明符还有什么影响?_C++_Inheritance_Private_Public_Protected - Fatal编程技术网

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;
};