メンバー・アクセス

C++ メンバー・アクセス は、式または宣言内で、 クラス・メンバーがアクセス可能かどうかを判別します。

x がクラス A のメンバーだとすると、クラス・メンバー x を宣言して、 次のアクセス可能性のレベルの 1 つを持つことができます。

キーワード class を指定して宣言されたクラスのメンバーのデフォルトは、private です。 キーワード struct または union を指定して宣言されたクラスのメンバーのデフォルトは、public です。

クラス・メンバーのアクセスを制御するには、アクセス指定子 publicprivate、または 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::aA::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++ のスコープ規則に基づきます。 クラス・メンバーが、可視であり、同時にアクセス不能ということはあり得ます。

関連参照

IBM Copyright 2003