読者です 読者をやめる 読者になる 読者になる

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章 静的メンバ

「実体」をクラス定義の外側に書くことから分かるように、静的メンバ変数はクラス自体に含まれている訳ではありません。 イメージ的にはグローバル変数のような感じであって、スコープがそのクラスに限定されるという考え方です。

なるほど.