変数が、クラスに属していることを宣言するためには、staticキーワードでメンバ変数を宣言します。
staticキーワードで宣言された静的メンバ変数の数は、オブジェクトがいくつ生成されようとも、一つのみのままです。
staticでないメンバ変数は、生成されたオブジェクトの数と同じだけ作成されます。
以下に、現在、生成されたオブジェクト数をカウントするプログラムを考えてみます。
#include <iostream>
class obj_count{
public:
int count; // 生成されたオブジェクトの数
public:
// インクリメント
obj_count() {
++count;
}
// デクリメント
~obj_count() {
--count;
}
// count数を表示
void display() {
std::cout << count << "\n";
}
};
int main() {
obj_count a_obj;
a_obj.count = 1;
a_obj.display(); // オブジェクトのカウント数
obj_count b_obj;
b_obj.display(); // オブジェクトのカウント数。失敗!
return 0;
}
生成されたオブジェクトの数を、メンバ変数countとし、コンストラクタでインクリメント、デストラクタでデクリメントすることで、オブジェクトの数を数えることを期待したコードです。
mainルーチンで、「b_obj.display();」により「2」の出力を期待しましたが、実行結果は・・・
1 -1454329974
と、上手く行きません。
これは、「obj_count b_obj」により、メンバ変数countがもう一つ作成され、その初期化を行っていないためです。
では、上記コードのメンバ変数countをstatic宣言して、静的メンバ変数とします。
こうすれば、countはクラスに属する変数として、すべてのオブジェクトから共通に使えます。
#include <iostream>
class obj_count {
public:
static int count; // 生成されたオブジェクトの数
// インクリメント
obj_count() {
++count;
}
// デクリメント
~obj_count() {
--count;
}
// count数を表示
void display() {
std::cout << count << "\n";
}
};
// 静的メンバ変数countの初期化
int obj_count::count = 0;
int main() {
obj_count a_obj;
a_obj.display(); // オブジェクトのカウント数
obj_count b_obj;
b_obj.display(); // オブジェクトのカウント数。
obj_count c_obj;
c_obj.display(); // オブジェクトのカウント数。
return 0;
}
いくつか注意点があり・・・
1.static int count;で、countを静的メンバ変数として宣言
2.int obj_count::count = 0;で、静的メンバ変数countの初期化を行う。静的メンバ変数には「::」でアクセスする。
実行結果。
1 2 3
すると、今度は、生成されたオブジェクトの数が、ちゃんとカウントされています。
■この記事のトラックバックURL:
http://www.mapee.jp/mpe334/mt-tb.cgi/247