C++のstatic変数とライフタイム管理を完全解説!初心者でもわかる仕組みと考え方
生徒
「C++のstatic変数って、普通の変数と何が違うんですか?」
先生
「変数がどれくらいの時間生き続けるか、つまりライフタイムが大きく違います。」
生徒
「ライフタイムって、変数の寿命みたいなものですか?」
先生
「その通りです。身近な例えを使って、static変数を順番に説明します。」
1. static変数とは何か
C++のstatic変数とは、特別な性質を持った変数です。 普通の変数は、使われる場所を抜けると消えてしまいますが、 static変数は一度作られると、プログラムが終わるまで残り続けます。
この「どれくらいの時間存在するか」という考え方を、 ライフタイムと呼びます。 ライフタイムとは、変数が生まれてから消えるまでの期間のことです。
static変数は、長生きする変数だと覚えると理解しやすくなります。
2. ローカル変数とのライフタイムの違い
まずは、普通のローカル変数の動きを見てみましょう。 ローカル変数は、関数の中で作られ、その関数が終わると消えます。
#include <iostream>
void showNumber() {
int number = 1;
std::cout << number << std::endl;
}
int main() {
showNumber();
showNumber();
return 0;
}
1
1
この例では、関数が呼ばれるたびにnumberが新しく作られます。 そのため、毎回同じ数字が表示されます。 これがローカル変数の短いライフタイムです。
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. グローバル変数との違い
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. ライフタイム管理を意識する理由
プログラムでは、必要な間だけ変数を生かしておくことが大切です。 これをライフタイム管理と呼びます。
ずっと残る変数が多すぎると、 どこで値が変わったのか分からなくなります。 逆に、すぐ消えてしまうと、情報を引き継げません。
static変数は、「覚えておきたい情報」を扱うための仕組みです。 回数の記録や状態の保持など、限られた場面で使うと、 C++の変数とデータ型の理解がより深まります。