【C++】変数の記録寿命(スコープとライフタイム)を理解する static の使い方

目次

はじめに

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 を使ったローカル変数は、特定の関数の中からだけアクセスできる、値が保持される変数として、グローバル変数よりも安全な代替手段となります。

この変数の寿命を理解することで、意図しない値の消滅を防ぎ、プログラムの動きをより正確に制御できるようになります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次