静的データ・メンバー

C++クラスの静的データ・メンバーのコピーが 1 つだけ存在し、そのクラスのすべてのオブジェクトで共用されます。

ネーム・スペース・スコープのクラスの静的データ・メンバーには、外部結合があります。 静的データ・メンバーは、通常のクラス・アクセス規則に従いますが、ファイル・スコープで初期化できる点が異なります。 静的データ・メンバーとその初期化指定子は、そのクラスの、他の静的の private メンバーおよび保護メンバーにアクセスすることができます。 静的データ・メンバー用の初期化指定子は、メンバーを宣言するクラスのスコープ内にあります。

静的データ・メンバーは、void、あるいは const または volatile で修飾された void を除く、あらゆる型に指定できます。

クラスのメンバー・リストにおける静的データ・メンバーの宣言は、定義ではありません。 静的データ・メンバーの定義は、外部変数の定義と同じです。 静的メンバーは、ネーム・スペース・スコープのクラス宣言の外側で定義することが必要です。

次に例を示します。

class X
{
public:
      static int i;
};
int X::i = 0; // definition outside class declaration
 

静的データ・メンバーをいったん定義したあとは、そのメンバーは、静的データ・メンバー・クラスの オブジェクトがなくても存在します。 上記の例では、静的データ・メンバー X::i が定義されていても、クラス X の オブジェクトは、存在しません。

以下の例は、他の静的メンバー (そのメンバーが private であっても) を使用して、どのように静的メンバーを 初期化できるかを示しています。

class C {
      static int i;
      static int j;
      static int k;
      static int l;
      static int m;
      static int n;
      static int p;
      static int q;
      static int r;
      static int s;
      static int f() { return 0; }
      int a;
public:
      C() { a = 0; }
      };

C c;
int C::i = C::f();    // initialize with static member function
int C::j = C::i;      // initialize with another static data member
int C::k = c.f();     // initialize with member function from an object
int C::l = c.j;       // initialize with data member from an object
int C::s = c.a;       // initialize with nonstatic data member
int C::r = 1;         // initialize with a constant value

class Y : private C {} y;
 
int C::m = Y::f();
int C::n = Y::r;
int C::p = y.r;       // error
int C::q = y.f();     // error

y は、C から private に派生したクラスのオブジェクトであるため 、C::p および C::q の初期化はエラーとなり、 このオブジェクトのメンバーは、C のメンバーからはアクセスできません。

静的データ・メンバーが const 整数型、または const 列挙型のメンバーで ある場合、定数初期化指定子 を静的データ・メンバーの宣言で指定できます。 この定数初期化指定子は、整数定数式でなければなりません。 定数初期化指定子は、定義ではないことに注意してください。 それでも、静的メンバーは囲みネーム・スペース内に定義する必要があります。 次の例は、このことを示しています。

#include <iostream>
using namespace std;
 
struct X {
  static const int a = 76;
};
 
const int X::a;
 
int main() {
  cout << X::a << endl;
}

静的データ・メンバー a の最後に宣言されているトークン = 76 が、定数初期化指定子です。

プログラム内には、静的メンバーの定義は 1 つしか入れられません。 名前のないクラスや、名前のないクラスに含まれるクラスは、静的データ・メンバーを持つことができません。

静的データ・メンバーを mutable として宣言できません。

ローカル・クラスは静的データ・メンバーを持つことができません。

関連参照

IBM Copyright 2003