メンバー・アクセス (C++ のみ)
メンバー・アクセス は、式または宣言内で、
クラス・メンバーがアクセス可能かどうかを判別します。
x がクラス A のメンバーであるとします。このクラス・メンバー x は、以下のいずれかのレベルのアクセス可能性を持つものとして宣言することができます。
- public: x は、private や protected で定義したアクセス制限以外の場所なら、 どこででも使用できます。
- private: x は、クラス A のメンバーとフレンドだけが使用できます。
- protected: x は、クラス A のメンバーとフレンド、 およびクラス A から派生したクラスのメンバーとフレンドだけが使用できます。
キーワード 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 のフレンドです。 |
のオブジェクト y |
アクセス不可。メンバー 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++ のスコープ規則に基づきます。 クラス・メンバーが、可視であり、同時にアクセス不能ということはあり得ます。