static
staticをつけると,
その変数のコピーはひとつしか存在しなくなる.
Javaとおなじやね.
staticのメンバ変数はデフォルト0で初期化される.
宣言はクラス内でして,
定義はクラス外でしなければならない.
static 関数はstaticなデータを初期化するときに使うといいらしい.
#include <iostream> using namespace std; class ExStatic{ // static 変数の宣言 static int num; public: // static 関数 static void init(){ num = 100; } int getNum(){ return num; } void setNum(int x){ num = x; } }; // static 変数の定義 int ExStatic::num; int main(){ // オブジェクト作成する前に初期化 ExStatic::init(); // オブジェクトを作成 ExStatic es1; ExStatic es2; // es1側からnumを表示してみる cout << "es1から:" << es1.getNum() << endl; // es1側からnumをセットしてみる es1.setNum(1024); cout << "-------------------------" << endl; // es1側からnumを表示してみる cout << "es1から:" << es1.getNum() << endl; // es2側からnumを表示してみる cout << "es2から:" << es2.getNum() << endl; return 0; }
出力結果.
es1から:100 ------------------------- es1から:1024 es2から:1024
ちなみに...
Javaみたいに宣言しただけで,定義をしないとこんなエラー.
Undefined symbols for architecture x86_64: "ExStatic::num", referenced from: ExStatic::init() in ccyE7mCf.o ExStatic::getNum() in ccyE7mCf.o ExStatic::setNum(int) in ccyE7mCf.o ld: symbol(s) not found for architecture x86_64 collect2: ld returned 1 exit status
bob(mk2)が,
「なんで定義しなくちゃいけないんだろう..」
といっていた.
なぜGlobalで定義しなくてはいけないのか・・・.
へー.こういうことらしい.確かにそうだね.
以下引用.
C++編(言語解説) 第19章 静的メンバ
「実体」をクラス定義の外側に書くことから分かるように、静的メンバ変数はクラス自体に含まれている訳ではありません。 イメージ的にはグローバル変数のような感じであって、スコープがそのクラスに限定されるという考え方です。
なるほど.