クラス内でstatic宣言されているメンバ変数あるいはメンバ関数は、オブジェクトを生成しなくても存在します。static宣言されたメンバ変数/関数は、すべてのオブジェクトで共有されます。ただしクラス内でstatic宣言されたメンバ変数については、クラスの外で変数の実体を定義する必要があります。オブジェクトがないのに、どうやってそのメンバ関数や変数をよぶかというと、クラス名::メンバで。 class MyClass{ public: static void staticfoo(){ printf("static関数\n");} static int sint; void foo()({ printf("普通のメンバ関数\n"); } }; int MyClass::sint; //MyClass::sintの実体を定義 int main(void) { MyClass::staticfoo(); //オブジェクトが存在しなくても関数は存在する。 MyClass a,b; a.sint = 20; //MyClassオブジェクトaのメンバsintに20を代入 b.sint = 40; //MyClassオブジェクトbのメンバsintに40を代入 printf("a.sint = %d b.sint = %d\n",a.sint,b.sint); printf("MyClass::sint = %d\n",MyClass::sint); //オブジェクトが存在しなくてもsintは存在する。 return 0; } 出力 static関数 //呼べる a.sint = 40 b.sint = 40 //しかしながら、sintはすべてのオブジェクトで共有されているので結局a.sintもb.sintも同じものである。よって両方40と表示された。 MyClass::sint = 40