14 Member access control [class.access]

14.1 Access specifiers [class.access.spec]

Объявления участников могут быть помечены access-specifier:

access-specifier : member-specificationopt

An access-specifier определяет правила доступа для членов, следующих за ним до конца класса или до тех пор, пока access-specifier не встретится другой . [Example:

class X {
  int a;            // X​::​a is private by default: class used
public:
  int b;            // X​::​b is public
  int c;            // X​::​c is public
};

end example]

Допускается любое количество спецификаторов доступа и никакого определенного порядка не требуется. [Example:

struct S {
  int a;            // S​::​a is public by default: struct used
protected:
  int b;            // S​::​b is protected
private:
  int c;            // S​::​c is private
public:
  int d;            // S​::​d is public
};

end example]

[ Note: Влияние контроля доступа на порядок распределения элементов данных описано в [class.mem]. ]end note

Когда член повторно объявляется в определении его класса, доступ, указанный при его повторном объявлении, должен быть таким же, как и при его первоначальном объявлении. [Example:

struct S {
  class A;
  enum E : int;
private:
  class A { };        // error: cannot change access
  enum E: int { e0 }; // error: cannot change access
};

end example]

[ Note: В производном классе поиск имени базового класса найдет имя внедренного класса вместо имени базового класса в области, в которой он был объявлен. Имя внедренного класса может быть менее доступным, чем имя базового класса в области, в которой он был объявлен. ]end note

[Example:

class A { };
class B : private A { };
class C : public B {
  A* p;             // error: injected-class-name A is inaccessible
  ::A* q;           // OK
};

end example]