除了可访问性,还有什么访问说明符效果?

时间:2011-02-12 13:31:07

标签: c++ inheritance private public protected

除了对派生类可见或不可见的正常表达外,还有其他区别吗?

如果你让它更明显,它是否会带来更多或更少的记忆,它会减慢速度还是......?

2 个答案:

答案 0 :(得分:6)

除了外部成员或派生类的成员可访问性之外,访问说明符可能会影响对象布局。

引用我的other answer

通常,数据成员的内存地址按照它们在类中定义的顺序增加。但此订单可能会在遇到访问说明符(privateprotectedpublic的任何地方中断。这已在Inside the C++ Object Model Lippman 中详细讨论过。

摘录自C/C++ Users Journal

  

不允许编译器执行此操作   但重新排列本身。该   标准要求所有数据都是   在相同 public:,protected:或   私人:必须在那里布置   由编译器订购。 如果你   通过访问来散布您的数据   但是,编译器是说明符   允许重新排列   access-specifier-delimited块   数据改善布局即是   为什么有些人喜欢进入   每个数据前面的说明符   构件

有趣,不是吗?

答案 1 :(得分:3)

来自n3225 9.2 [class.mem] note 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的引用可以解释为给出4个可以自由混合的块,但事实并非如此。 Foo的声明完全等同于:

class Foo' {
public:  int a,c;
private: int b,d;
};

实际上,编译器完全忽略(为此目的)一个说明符是出现一次还是多次,并且每次指定它都是假的,并且最好因为额外的解析而减慢编译速度。对于人类读者来说,它可能更清楚......但这是非常主观的。