本文へスキップ
BecomeCoder

C++コース · 第10章 クラスの基礎 ― 自分だけの型を作る · レッスン43

static メンバ ― クラス全体で共有する

ブラウザで完結

導入

「インスタンスごとではなく、クラス全体で1つだけ持ちたい」データや関数があります。たとえば「これまで作った個数」。それを実現するのが static メンバです。

説明

static メンバ変数は、インスタンスをいくつ作ってもクラスに1つだけ存在し、全インスタンスで共有されます。クラス外で1度だけ実体を定義します。

flowchart TB
  s["static int count(クラスに1つ)"]
  a["インスタンス a"] --> s
  b["インスタンス b"] --> s
  c["インスタンス c"] --> s
#include <iostream>
using namespace std;

class Widget {
public:
    static int count;    // 宣言(全インスタンスで共有)
    Widget() { count++; }
};

int Widget::count = 0;   // 実体の定義(クラス外に1度だけ)

int main() {
    Widget a, b, c;
    cout << Widget::count << endl;   // 3(作った個数)
    return 0;
}

static メンバ関数は、特定のインスタンスに属さない関数です。this を持たず、static メンバや引数だけを使えます。呼び出しは クラス名::関数名() です。

#include <iostream>
using namespace std;

class MathUtil {
public:
    static int square(int x) {   // インスタンス不要の関数
        return x * x;
    }
};

int main() {
    cout << MathUtil::square(5) << endl;   // 25(インスタンスを作らず呼べる)
    return 0;
}

まとめ

static メンバは「クラスに1つだけ・全インスタンスで共有」。個数のカウントや、共通の定数・ユーティリティ関数に使います。static メンバ関数はインスタンスなしで クラス名:: で呼べます。

実際に動かしてみよう

下のエディタにC++を書いて「コンパイル & 実行」を押すと、ブラウザ内で本物のC++コンパイラ(clang + libc++)がその場でコンパイルして実行し、出力が表示されます。std::string・vector・クラス・テンプレート・STL などモダンC++がそのまま動きます。本文の例を書き換えて試しながら進めましょう(初回だけコンパイラの読み込みに時間がかかります。以降はキャッシュされます。この回は標準入力(cin)は使わず、値はコードに直接書きます)。

C/C++ — ブラウザ内で本物のコンパイラで実行

ブラウザ内で本物のC/C++コンパイラ(clang + libc++ / WebAssembly)を動かします。構造体・malloc/free・std::string・vector・クラス・テンプレート・STL などがそのまま実行できます(初回のみコンパイラの読み込みに時間がかかります。以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。