目次
はじめに
C++の変数は、宣言された場所(スコープ)だけでなく、その値がメモリ上にどれくらいの期間存在し続けるかという「記録寿命(ライフタイム)」の概念を持っています。
例えば、関数の中で宣言された通常の変数は、関数が終了すると同時に消滅します。しかし、static
というキーワードを付けて宣言すると、その変数は関数が終了しても消滅せず、値が保持され続けます。
この記事では、C++の変数が持つ記録寿命の違いと、static
キーワードがどのようにその寿命を延ばすのかを、具体的なサンプルコードを通して解説します。
変数の記録寿命を確認するサンプルコード
このコードは、グローバル変数、通常のローカル変数、static
ローカル変数の3つの変数を定義し、関数 callAndShow
を複数回呼び出すことで、それぞれの値がどのように変化するかを追跡します。
完成コード
#include <iostream>
using namespace std;
// --- 1. グローバル変数 ---
// プログラム全体で有効
int globalVar = 0;
void callAndShow();
int main() {
for (int i = 0; i < 3; i++) {
callAndShow();
cout << "------------" << endl;
}
return 0;
}
void callAndShow() {
// --- 2. 通常のローカル変数(自動寿命) ---
// 関数が呼ばれるたびに新しく作られ、関数終了時に消滅する
int localAutoVar = 0;
// --- 3. staticローカル変数(静的寿命) ---
// 初回呼び出し時に一度だけ作られ、値は保持される
static int localStaticVar = 0;
cout << "グローバル変数: " << globalVar << endl;
cout << "ローカル変数: " << localAutoVar << endl;
cout << "static変数: " << localStaticVar << endl;
globalVar++;
localAutoVar++;
localStaticVar++;
}
実行結果
グローバル変数: 0
ローカル変数: 0
static変数: 0
------------
グローバル変数: 1
ローカル変数: 0
static変数: 1
------------
グローバル変数: 2
ローカル変数: 0
static変数: 2
------------
コードの解説
1. グローバル変数 (globalVar
)
- 寿命: プログラムの開始から終了まで。
- 動作:
main
関数やcallAndShow
関数が何度呼び出されても、globalVar
は消滅しません。そのため、globalVar++
によって値が保持され、呼び出しごとに1
,2
,3
と増えていきます。
2. 通常のローカル変数 (localAutoVar
)
- 寿命: 関数が呼ばれている間だけ。
- 動作:
callAndShow
関数が呼び出されるたびに、新しくlocalAutoVar
が作られ、初期値0
が代入されます。関数が終了すると同時に消滅するため、localAutoVar++
で値が1
になっても、次の呼び出し時にはその値は失われ、再び0
から始まります。
3. static
ローカル変数 (localStaticVar
)
- 寿命: プログラムの開始から終了まで。
- 動作:
static
を付けて宣言されたローカル変数は、その関数が初めて呼び出されたときに一度だけ作られ、初期化されます。関数が終了してもメモリ上に残り続けるため、localStaticVar++
で値が1
になると、次の呼び出し時にもその1
という値が保持され、そこから2
,3
と増えていきます。
まとめ
今回は、C++における変数の記録寿命について解説しました。
- 通常のローカル変数: 関数が呼ばれている間だけ存在し、関数終了時に消滅する。
- グローバル変数 /
static
ローカル変数: プログラムが終了するまで存在し、値が保持される。 static
を使ったローカル変数は、特定の関数の中からだけアクセスできる、値が保持される変数として、グローバル変数よりも安全な代替手段となります。
この変数の寿命を理解することで、意図しない値の消滅を防ぎ、プログラムの動きをより正確に制御できるようになります。