メンバー・アクセス は、式または宣言内で、
クラス・メンバーがアクセス可能かどうかを判別します。
x がクラス A のメンバーだとすると、クラス・メンバー x を宣言して、 次のアクセス可能性のレベルの 1 つを持つことができます。
キーワード class を指定して宣言されたクラスのメンバーのデフォルトは、private です。 キーワード struct または union を指定して宣言されたクラスのメンバーのデフォルトは、public です。
クラス・メンバーのアクセスを制御するには、アクセス指定子 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 |
---|---|---|---|
関数 B::f() | アクセス不可。メンバー A::a は、private です。 | アクセス可能。メンバー A::b は、public です。 | アクセス可能。クラス B は、A から継承します。 |
関数 C::f() | アクセス可能。クラス C は、A のフレンドです。 | アクセス可能。メンバー A::b は、public です。 | アクセス可能。クラス C は、A のフレンドです。 |
main() のオブジェクト y main() | アクセス不可。メンバー y.a は、private です。 | アクセス可能。メンバー y.a は、public です。 | アクセス不可。メンバー y.c は、protected です。 |
main() のオブジェクト z | アクセス不可。メンバー z.a は、private です。 | アクセス可能。メンバー z.a は、public です。 | アクセス不可。メンバー z.c は、protected です。 |
アクセス指定子は、次のアクセス指定子またはクラス定義の終わりまで、その後に続くメンバーのアクセス可能度を指定します。 任意の数のアクセス指定子を、任意の順序で使用することができます。 クラス定義内に後からクラス・メンバーを定義する場合、そのアクセス指定は、その宣言と同一にする必要があります。 次の例は、このことを示しています。
class A { class B; public: class B { }; };
コンパイラーは、クラス B がすでに private として宣言されているため、このクラスの定義を許可しません。
クラス・メンバーは、それがそのクラスの内側、またはクラスの外側に定義されたかどうかには関係なく、 同じアクセス制御を持っています。
アクセス制御は、名前に対応しています。 特に、アクセス制御を typedef 名に追加する場合、それは typedef 名だけに影響します。 次の例は、このことを示しています。
class A { class B { }; public: typedef B C; }; int main() { A::C x; // A::B y; }
コンパイラーは、typedef 名 A::C が public なので、宣言 A::C x を許可します。 コンパイラーは、A::B は、private なので、宣言 A::B y を認めません。
アクセス可能度と可視性は、別々のものであることに注意してください。 可視性は、C++ のスコープ規則に基づきます。 クラス・メンバーが、可視であり、同時にアクセス不能ということはあり得ます。
関連参照