Translations of this page?:

static

staticキーワードは以下の4つの異なる目的で使用されます:

  1. 関数のローカル変数を永続化(プログラムが起動している間、関数を出入りしてもずっと同じ状態を持ち続ける)
  2. クラス間で共有されるデータ
  3. 非メンバー関数のように動作するメンバー関数
  4. 内部リンクの設定

永続的な保持

staticなローカル変数は、関数を抜けてもずっと値を保持し続けます。例えば以下のコードの場合には、関数内のstatic変数を使用して、その関数が今までに何回呼ばれたかどうかというのを追跡しています:

void foo() {
  static int counter = 0;
  cout << "foo関数は " << ++counter << " 回呼ばれました\n";
}
 
int main() {
  for( int i = 0; i < 10; ++i ) foo();
}

クラス間で共有されるデータ

クラスのデータメンバーとして使用すると、すべてのクラスのインスタンス間で共有される変数として使用できます。

class Foo {
public:
  Foo() {
    ++numFoos;
    cout << "私たちはFooクラスのインスタンスを " << numFoos << " 個作りました\n";
  }
private:
  static int numFoos;
};
 
int Foo::numFoos = 0;  // numFoosのメモリを割り当てて初期化します
 
int main() {
  Foo f1;
  Foo f2;
  Foo f3;
}

上記の例の場合には、staticクラス変数のnumFoosを、3つのFooクラスのインスタンス(f1, f2, f3)間で共有しています。numFoosはFooクラスがいままでに何個インスタンス化されたのか、という数をカウントします。

オブジェクトを生成しないでもコールできるクラス関数

クラスの関数のメンバーに対して使用すると、関数は暗示的なthisパラメータを受け取らなくなり、クラスに属さない関数と同じように振る舞います。これはstaticなクラス関数は、クラスのインスタンスを作成しなくても呼ぶことができるという意味です。

class Foo {
public:
  Foo() {
    ++numFoos;
    cout << "私たちはFooクラスのインスタンスを " << numFoos << " 個作りました\n";
  }
  static int getNumFoos() {
    return numFoos;
  }
private:
  static int numFoos;
};
 
int Foo::numFoos = 0;  // numFoosのメモリを割り当てて初期化します
 
int main() {
  Foo f1;
  Foo f2;
  Foo f3;
  cout << "これまでに " << Foo::getNumFoos() << " 個のFooクラスのインスタンスが作成されています\n";
}

内部リンク

クラスに属さない関数やグローバル変数、グローバル定数に対して使用すると、内部リンクであると設定します。外部リンクであるexternリンクとは逆の動作になります。内部リンクの場合には、現在のファイル内からのみ、そのデータや関数を使用できるようになります。

関連トピック: extern

 
• • • SitemapRecent changesRSScc