目次
はじめに
C++プログラミングにおいて、変数を宣言する「場所」は非常に重要です。なぜなら、変数が宣言された場所によって、その変数がプログラムのどこからアクセスできるかという有効範囲が決まるからです。この有効範囲のことを「スコープ (scope)」と呼びます。
スコープには、大きく分けて以下の2種類があります。
- グローバルスコープ: プログラムのどこからでもアクセスできる。
- ローカルスコープ: 特定の関数の中など、限られた範囲内でのみアクセスできる。
この記事では、グローバル変数とローカル変数の違いと、それぞれのスコープの仕組みについて、分かりやすく解説します。
グローバル変数とローカル変数のサンプルコード
このコードは、グローバル変数 globalVar
、main
関数内のローカル変数 mainLocalVar
、そして anotherFunction
内のローカル変数 funcLocalVar
を定義し、それぞれの関数からどの変数にアクセスできるかを示します。
完成コード
#include <iostream>
using namespace std;
// --- 1. グローバル変数の宣言 ---
// 全ての関数の外で宣言
int globalVar = 100;
// 関数のプロトタイプ宣言
void anotherFunction();
int main() {
// --- 2. main関数のローカル変数の宣言 ---
int mainLocalVar = 10;
cout << "--- main関数の中 ---" << endl;
cout << "グローバル変数 globalVar の値: " << globalVar << endl;
cout << "mainのローカル変数 mainLocalVar の値: " << mainLocalVar << endl;
// NG: anotherFunctionのローカル変数にはアクセスできない
// cout << funcLocalVar << endl; // コンパイルエラー!
// グローバル変数の値を変更
globalVar = 150;
// 別の関数を呼び出す
anotherFunction();
return 0;
}
void anotherFunction() {
// --- 3. anotherFunctionのローカル変数の宣言 ---
int funcLocalVar = 20;
cout << "\n--- anotherFunctionの中 ---" << endl;
cout << "グローバル変数 globalVar の値: " << globalVar << endl; // mainで変更した値(150)が見える
cout << "anotherFunctionのローカル変数 funcLocalVar の値: " << funcLocalVar << endl;
// NG: main関数のローカル変数にはアクセスできない
// cout << mainLocalVar << endl; // コンパイルエラー!
}
コードの解説
1. グローバル変数 (globalVar
)
- 宣言場所: 全ての関数ブロック
{}
の外側。 - スコープ: プログラム全体。
main
関数からもanotherFunction
からも、どこからでもアクセス(参照・変更)が可能です。main
で値を150
に変更した後、anotherFunction
でその値を表示できていることが分かります。 - 注意点: どこからでも変更できてしまうため、大規模なプログラムで多用すると、どこで値が変更されたか追跡が難しくなり、バグの原因になりやすいです。利用は最小限に留めるのが良い設計とされています。
2. ローカル変数 (mainLocalVar
, funcLocalVar
)
- 宣言場所: 関数ブロック
{}
の内側。 - スコープ: 宣言された関数ブロック
{}
の内部に限定されます。 main
関数で宣言されたmainLocalVar
は、anotherFunction
からは見えません。逆も同様です。そのため、異なる関数内であれば、同じ名前のローカル変数をそれぞれ定義しても、互いに干渉することはありません。- ローカル変数は、その関数が終了するとメモリ上から破棄されます。
グローバル変数とローカル変数の名前が重なった場合
もし、ローカル変数にグローバル変数と同じ名前を付けた場合、その関数の中ではローカル変数が優先されます。
int value = 100; // グローバル
void someFunc() {
int value = 20; // ローカル
cout << value; // -> 20 (ローカル変数が優先される)
}
まとめ
今回は、C++における変数のスコープ(グローバルとローカル)の違いについて解説しました。
- グローバル変数: 関数の外で宣言。プログラム全体からアクセス可能。便利だが多用は危険。
- ローカル変数: 関数の中で宣言。その関数内でのみ有効。安全なので基本はこちらを使う。
変数のスコयोプを正しく理解し、その有効範囲を適切に限定することは、意図しない値の書き換えを防ぎ、見通しの良いプログラムを作成するための基本中の基本です。