クラスの静的データ・メンバーのコピーが 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 として宣言できません。
ローカル・クラスは静的データ・メンバーを持つことができません。
関連参照