成员访问(仅限 C++)
成员访问权 确定是否可以在表达式或声明中访问类成员。 假设
x 是类 A的成员。 可以将类成员 x 声明为具有下列其中一个辅助功能选项级别:public:x可以在不受专用或受保护的访问限制的任何位置使用。private:x只能由类A的成员和友元使用。protected:x只能由类A的成员和友元以及从类A派生的类的成员和友元使用。
缺省情况下,使用关键字 class 声明的类的成员是私有的。 缺省情况下,使用关键字 struct 或 union 声明的类的成员是公共的。
要控制类成员的访问权,请使用其中一个 访问说明符
public, private或 protected 作为类成员列表中的标签。 以下示例演示了这些访问说明符: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::b和 A::c 的访问权。| 作用域 | A::a |
A::b |
A::c |
|---|---|---|---|
function B::f() |
无访问权。 成员 A::a 是私有成员。 |
访问权。 成员 A::b 是公共成员。 |
访问权。 类 B 继承自 A。 |
function C::f() |
访问权。 类 C 是 A的友元。 |
访问权。 成员 A::b 是公共成员。 |
访问权。 类 C 是 A的友元。 |
对象 y 位于 |
无访问权。 成员 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++ 的作用域限定规则。类成员可以同时可视和不可访问。