静的メンバー (C++)

クラスには、静的なメンバー データとメンバー関数を含めることができます。 データ メンバーが static として宣言されている場合は、クラスのすべてのオブジェクトに対してデータのコピーが 1 つだけ保持されます。

静的データ メンバーは、特定のクラス型のオブジェクトの一部ではありません。 その結果、静的データ メンバーの宣言は定義とは見なされません。 データ メンバーはクラス スコープで宣言されますが、定義はファイル スコープで行われます。 これらの静的メンバーは外部リンケージを持ちます。 次に例を示します。

// static_data_members.cpp
class BufferedOutput
{
public:
   // Return number of bytes written by any object of this class.
   short BytesWritten()
   {
      return bytecount;
   }

   // Reset the counter.
   static void ResetCount()
   {
      bytecount = 0;
   }

   // Static member declaration.
   static long bytecount;
};

// Define bytecount in file scope.
long BufferedOutput::bytecount;

int main()
{
}

上記のコードで、メンバー bytecount は、クラス BufferedOutput で宣言されていますが、クラス宣言の外側で定義する必要があります。

静的データ メンバーは、クラス型のオブジェクトを参照せずに参照できます。 BufferedOutput オブジェクトを使用して書き込まれたバイト数は、次のように取得できます。

long nBytes = BufferedOutput::bytecount;

静的メンバーを存在させるために、クラス型のオブジェクトが存在する必要はありません。 静的メンバーには、メンバー選択 (.->) 演算子を使用してアクセスすることもできます。 次に例を示します。

BufferedOutput Console;

long nBytes = Console.bytecount;

前のケースでは、オブジェクト (Console) への参照は評価されません。返される値は、静的オブジェクト bytecount の値です。

静的データ メンバーはクラス メンバーのアクセス規則に従うため、静的データ メンバーへのプライベート アクセスはクラス メンバー関数およびフレンドだけに許可されます。 これらの規則については、「メンバー アクセス コントロール」で説明します。 例外は、静的データ メンバーが、そのアクセス制限にかかわらず、ファイルのスコープ内で定義されなければならないということです。 データ メンバーを明示的に初期化する場合は、初期化子を定義で指定する必要があります。

静的メンバーの型は、クラス名で修飾されていません。 そのため、BufferedOutput::bytecount の型は long です。

関連項目

クラスと構造体