カテゴリ: C++ 更新日: 2026/01/13

C++のstatic変数とライフタイム管理を完全解説!初心者でもわかる仕組みと考え方

static変数とライフタイム管理
static変数とライフタイム管理

先生と生徒の会話形式で理解しよう

生徒

「C++のstatic変数って、普通の変数と何が違うんですか?」

先生

「変数がどれくらいの時間生き続けるか、つまりライフタイムが大きく違います。」

生徒

「ライフタイムって、変数の寿命みたいなものですか?」

先生

「その通りです。身近な例えを使って、static変数を順番に説明します。」

1. static変数とは何か

1. static変数とは何か
1. static変数とは何か

C++のstatic変数とは、特別な性質を持った変数です。 普通の変数は、使われる場所を抜けると消えてしまいますが、 static変数は一度作られると、プログラムが終わるまで残り続けます。

この「どれくらいの時間存在するか」という考え方を、 ライフタイムと呼びます。 ライフタイムとは、変数が生まれてから消えるまでの期間のことです。

static変数は、長生きする変数だと覚えると理解しやすくなります。

2. ローカル変数とのライフタイムの違い

2. ローカル変数とのライフタイムの違い
2. ローカル変数とのライフタイムの違い

まずは、普通のローカル変数の動きを見てみましょう。 ローカル変数は、関数の中で作られ、その関数が終わると消えます。


#include <iostream>

void showNumber() {
    int number = 1;
    std::cout << number << std::endl;
}

int main() {
    showNumber();
    showNumber();
    return 0;
}

1
1

この例では、関数が呼ばれるたびにnumberが新しく作られます。 そのため、毎回同じ数字が表示されます。 これがローカル変数の短いライフタイムです。

3. staticローカル変数の動き

3. staticローカル変数の動き
3. staticローカル変数の動き

次に、同じ場所でstaticを付けた場合を見てみましょう。 staticローカル変数は、場所は関数の中ですが、 ライフタイムはプログラム全体になります。


#include <iostream>

void countUp() {
    static int count = 0;
    count++;
    std::cout << count << std::endl;
}

int main() {
    countUp();
    countUp();
    countUp();
    return 0;
}

1
2
3

static変数は最初の一回だけ初期化され、 その後は前の値を覚えたまま使われます。

例えるなら、毎回消えるメモではなく、 机の引き出しにずっと入っているノートのような存在です。

4. グローバル変数との違い

4. グローバル変数との違い
4. グローバル変数との違い

static変数は、グローバル変数と似ている部分もあります。 どちらもプログラムが終わるまで生き続けるからです。

ただし、使える範囲が違います。 staticローカル変数は、その関数の中だけで使えます。 外から勝手に変更される心配がありません。


#include <iostream>

void sample() {
    static int value = 10;
    std::cout << value << std::endl;
}

int main() {
    sample();
    sample();
    return 0;
}

10
10

このように、見える範囲は狭く、 でもライフタイムは長いというのがstatic変数の特徴です。

5. ライフタイム管理を意識する理由

5. ライフタイム管理を意識する理由
5. ライフタイム管理を意識する理由

プログラムでは、必要な間だけ変数を生かしておくことが大切です。 これをライフタイム管理と呼びます。

ずっと残る変数が多すぎると、 どこで値が変わったのか分からなくなります。 逆に、すぐ消えてしまうと、情報を引き継げません。

static変数は、「覚えておきたい情報」を扱うための仕組みです。 回数の記録や状態の保持など、限られた場面で使うと、 C++の変数とデータ型の理解がより深まります。

カテゴリの一覧へ
新着記事
New1
C++
C++のメンバアクセス演算子を完全解説!初心者でもわかる . → :: の使い方まとめ
New2
Rust
Rustの文字列を極める!&str(文字列スライス)の基本概念とString型との違い
New3
C++
C++のキャスト演算子を完全解説!dynamic_cast・static_cast・const_cast・reinterpret_castを初心者向けに説明
New4
C++
C++開発のIDE選びを完全ガイド!初心者でもわかるCLion・Eclipse CDT・Qt Creator比較
人気記事
No.1
Java&Spring記事人気No1
C++
C++の主要な実装をわかりやすく解説!GCC・Clang・MSVCの違いと特徴
No.2
Java&Spring記事人気No2
C言語
C言語を学ぶ初心者におすすめの環境構築手順【2025年版】
No.3
Java&Spring記事人気No3
C言語
C言語をオンラインで実行できる便利なコンパイラサービスまとめ【初心者向け】
No.4
Java&Spring記事人気No4
C言語
C言語のソースコードとヘッダファイルの役割とは?初心者向けにわかりやすく解説!
No.5
Java&Spring記事人気No5
C言語
Visual Studio CodeでC言語を実行する方法【拡張機能の設定と実行手順】
No.6
Java&Spring記事人気No6
C言語
C言語開発でよく使われるエディタとIDEランキング【初心者向け完全ガイド】
No.7
Java&Spring記事人気No7
C++
C++リンカとコンパイラのオプション設定を完全ガイド!初心者にもわかる開発環境の基礎
No.8
Java&Spring記事人気No8
C言語
C言語の列挙型(enum)の使い方を完全ガイド!初心者でもわかる基本操作