static・静的メンバ変数
スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
変数が、クラスに属していることを宣言するためには、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
すると、今度は、生成されたオブジェクトの数が、ちゃんとカウントされています。
スポンサーリンク
>> 次の記事 : static・静的メンバ関数
<< 前の記事 : 定数のconstメンバ関数をクラスに宣言
- - 関連記事 -
- 派生クラスのコンストラクタ・デストラクタ
- 派生クラスによる関数の隠蔽
- 仮想クラス
- 抽象クラス
- 仮想関数・virtualキーワード
- 親クラスの引数ありコンストラクタを子クラスから初期化・動的サイズのスタック
- クラスのアクセス制限キーワード・private, protected, public
- スタックを実装したクラスを拡張する
- クラス継承・親クラスと子クラス
- static・静的メンバ関数
- 定数のconstメンバ関数をクラスに宣言
- 定数のconstメンバ変数をクラスに宣言
- フレンドクラス・friend
- フレンド関数・friend
- クラスの中にメンバ関数(メソッド)を実装する
- explicit・コンストラクタを明示する
- クラスで自動的に生成されるメンバ関数
- コピーコンストラクタ
- 引数つきのコンストラクタを持つクラス定義
- コンストラクタで自動的に初期化する
スポンサーリンク