static

static.png

意味

メンバの宣言での通常の意味と同じ。
クラス全体の中で、このメンバのコピーは1個しか存在せず、
そのメンバはオブジェクトがなくてもアクセスできる、
という意味。

機能

グローバル変数にアクセスできる範囲を限定する機能がある
ソースプログラムを複数のファイルに分割し、変数やサブルーチンにstaticと指定すれば、別のファイルからアクセスできなくなる[2]

static変数

void f(){
static int count=0;//初期設定は1度だけ。
count++;
}

このカウントは、この関数fが最初に呼び出されたときだけ0で初期化される。
あとはfを呼び出すたびに値が変わる。グローバル変数みたいになるかな。

使い方

  1. クラス内でstatic変数を宣言する
  2. static変数を初期化する用のstaticメンバ関数を作る
  3. staticメンバ関数の中身を.cppに書く。
  4. static変数の定義を.cppに書く1

static変数の利点

他の関数がアクセス、破壊する可能性のあるグローバル変数を導入せずに、関数にメモリを提供する。

staticの使い時

そのクラスが自分の型のオブジェクトが何個存在するのかを動的に管理したい時

オブジェクトを数えるstaticなクラスメンバを作成する。
このメンバは0で初期化し、
クラスのコンストラクタでインクリメントし、
デストラクタでデクリメントする

class Class{
Class(){++num_me;};
~Class(){--num_me;};
static int howManyMe(){return num_me;}//num_meのゲッター
private:
static int num_me;//自分は何個存在するのかというstaticのカウンタ
};
//クラスの静的オブジェクトは、クラスの外側で定義しなければならない。
//デフォルトにより、0で初期化される
size_t Class::num_me;//statiメンバ変数の実体 .cppに書く

複数のオブジェクトでいっしょくたにステートを変更したくなったとき

に使いたくなってきた。

staticなメンバ関数

staticメソッドを使えば「メンバ変数と関係ない」ことがよくわかる[4]

サポートサイト Wikidot.com