成员访问(仅限 C++)

成员访问权 确定是否可以在表达式或声明中访问类成员。 假设 x 是类 A的成员。 可以将类成员 x 声明为具有下列其中一个辅助功能选项级别:
  • public: x 可以在不受专用或受保护的访问限制的任何位置使用。
  • private: x 只能由类 A的成员和友元使用。
  • protected: x 只能由类 A的成员和友元以及从类 A派生的类的成员和友元使用。

缺省情况下,使用关键字 class 声明的类的成员是私有的。 缺省情况下,使用关键字 structunion 声明的类的成员是公共的。

要控制类成员的访问权,请使用其中一个 访问说明符 publicprivateprotected 作为类成员列表中的标签。 以下示例演示了这些访问说明符:
struct A {
  friend class C;
private:
  int a;
public:
  int b;
protected:
  int c;
};

struct B : A {
  void f() {
    // a = 1;
    b = 2;
    c = 3;
  }
};

struct C {
  void f(A x) {
    x.a = 4;
    x.b = 5;
    x.c = 6;
  }
};

int main() {
  A y;
//  y.a = 7;
  y.b = 8;
//  y.c = 9;

  B z;
//  z.a = 10;
  z.b = 11;
//  z.c = 12;
}
下表列出了上述示例的各种作用域中的数据成员 A::a A::bA::c 的访问权。
作用域 A::a A::b A::c
function B::f() 无访问权。 成员 A::a 是私有成员。 访问权。 成员 A::b 是公共成员。 访问权。 类 B 继承自 A
function C::f() 访问权。 类 CA的友元。 访问权。 成员 A::b 是公共成员。 访问权。 类 CA的友元。
对象 y 位于
main()
无访问权。 成员 y.a 是私有成员。 访问权。 成员 y.a 是公共成员。 无访问权。 成员 y.c 受保护。
main() 中的对象 z 无访问权。 成员 z.a 是私有成员。 访问权。 成员 z.a 是公共成员。 无访问权。 成员 z.c 受保护。
访问说明符指定跟随它的成员的辅助功能选项,直到下一个访问说明符或类定义结束为止。 您可以按任意顺序使用任意数量的访问说明符。 如果稍后在其类定义中定义类成员,那么其访问规范必须与其声明相同。 以下示例对此进行了演示:
class A {
    class B;
  public:
    class B { };
};
编译器将不允许类 B 的定义,因为此类已声明为专用类。

类成员具有相同的访问控制,而不管它是在其类中定义的还是在其类外定义的。

访问控制适用于名称。 特别是,如果向 typedef 名称添加访问控制,那么它仅影响 typedef 名称。 以下示例对此进行了演示:
class A {
    class B { };
  public:
    typedef B C;
};

int main() {
  A::C x;
//  A::B y;
}
编译器将允许声明 A::C x ,因为 typedef 名称 A::C 是公用的。 编译器不允许声明 A::B y ,因为 A::B 是专用的。

请注意,辅助功能选项和可视性是独立的。 可视性基于 C++ 的作用域限定规则。类成员可以同时可视和不可访问。