2:半永久的に存在する変数・関数
C言語では、一度用意されると、ずっと値が保持されるstatic
修飾子が用意されています。
#include <stdio.h>
void Show1()
{
int i = 0;
printf("%d\n", i);
i++;
}
void Show2()
{
static int i = 0;
printf("%d\n", i);
i++;
}
void main()
{
int i;
for(i = 0; i < 10; i++) Show1();
for(i = 0; i < 10; i++) Show2();
}
auto
)であるため、Show1()関数の処理が終了すると、その内部にあった情報はすべて破棄されてしまい、そのため、何度Show1()を呼び出しても画面には「0」が表示されます。一方、Show2()関数の変数iは
static
宣言なので、関数が何度破棄されようが、変数iの値は残り続けるため、Show2()関数を呼び出すたびに値が1づつ増加していくことになります。
static
宣言は、クラスの中でも行うことができ、クラス内で行われた変数や関数は、いくら一家(オブジェクト)が集合・離散しようが、static
だけはどこにも行くことなく、半永久的(プログラムが終了するまで)に最後に代入された値を保持し続けることになります。
#include <stdio.h>
class CObject
{
public:
static int value;
void Show()
{
//このようにクラス内で関数の処理内容を記述してもかまわない
printf("%d\n", value);
}
};
int CObject::value; //static変数はどこかで実体化させる必要あり
void main()
{
CObject *obj1 = new CObject();
obj1->value = 100;
obj1->Show();
delete obj1;
CObject *obj2 = new CObject();
obj2->Show();
delete obj2;
printf("%d", CObject::value);
}
static
宣言した関数は、クラスを作成することなくその関数へとアクセスすることができるようになります。ただし、static
関数からは、static
宣言されていない変数や関数へはアクセスできませんのでご注意を。
#include <stdio.h>
class CObject
{
public:
static int value;
static void Show()
{
printf("%d\n", value);
}
};
int CObject::value; //static変数はどこかで実体化させる必要あり
void main()
{
CObject::value = 150;
CObject::Show();
}
extern
を使うことなく、クラスやファイルをまたいで同一の値を保持し続けることができるので、DirectXハンドラなど、プログラムを始終通じてアクセスし続ける必要のあるデータを管理しやすくなります。