C++ 変数スコープ
一般的に、変数を定義できる場所は3つあります:
関数またはコードブロック内で宣言された変数は、ローカル変数と呼ばれます。。
関数パラメータの定義で宣言された変数は、仮引数と呼ばれます。。
すべての関数の外部で宣言された変数は、グローバル変数と呼ばれます。。
スコープはプログラムの領域です。変数のスコープは次のように分類できます:
ローカルスコープ:関数内で宣言された変数はローカルスコープを持ち、関数内からのみアクセスできます。ローカル変数は関数が呼び出されるたびに作成され、関数の実行が完了すると破棄されます。
グローバルスコープ:すべての関数とコードブロックの外で宣言された変数はグローバルスコープを持ち、プログラム内の任意の関数からアクセスできます。グローバル変数はプログラムの開始時に作成され、プログラムの終了時に破棄されます。
ブロックスコープ:コードブロック内で宣言された変数はブロックスコープを持ち、コードブロック内からのみアクセスできます。ブロックスコープ変数はコードブロックが実行されるたびに作成され、コードブロックの実行が完了すると破棄されます。
クラススコープ:クラス内で宣言された変数はクラススコープを持ち、クラスのすべてのメンバ関数からアクセスできます。クラススコープ変数のライフサイクルはクラスのライフサイクルと同じです。
注意:内部スコープで宣言された変数が外部スコープの変数と同じ名前の場合、内部スコープの変数は外部スコープの変数を覆い隠します。
ローカル変数
関数またはコードブロック内で宣言された変数は、ローカル変数と呼ばれます。これらは関数内またはコードブロック内のステートメントでのみ使用できます。次の例ではローカル変数を使用しています:
例
グローバル変数
すべての関数の外部で定義された変数(通常はプログラムの先頭)は、グローバル変数と呼ばれます。グローバル変数の値は、プログラムの全期間を通じて有効です。
グローバル変数は任意の関数からアクセスできます。つまり、グローバル変数は一度宣言されると、プログラム全体で使用できます。次の例では、グローバル変数とローカル変数を使用しています:
例
プログラム内では、ローカル変数とグローバル変数の名前は同じにできますが、関数内では、ローカル変数の値がグローバル変数の値を覆い隠します。以下に例を示します:
例
上記のコードがコンパイルおよび実行されると、次の結果が生成されます:
10
ローカル変数とグローバル変数の初期化
ローカル変数が定義されたとき、システムはそれを初期化しないため、自分で初期化する必要があります。グローバル変数を定義するとき、システムは自動的に次の値に初期化します:
| データ型 | 初期化のデフォルト値 |
|---|---|
| int | 0 |
| char | '\0' |
| float | 0 |
| double | 0 |
| pointer | NULL |
変数を正しく初期化することは良いプログラミング習慣です。そうしないと、プログラムが予期しない結果を生むことがあります。
ブロックスコープとは、コードブロック内で宣言された変数を指します:
例
int main() {
int a = 10;
{
int a = 20; // ブロックスコープ変数
std::cout << "ブロック変数: " << a << std::endl;
}
std::cout << "外部変数: " << a << std::endl;
return 0;
}
上記の例では、内部のコードブロック内で a という名前の変数が宣言されており、これは外部スコープの変数 a と同じ名前です。内部スコープの変数 a は外部スコープの変数 a を覆い隠し、内部スコープで a にアクセスすると 20 が出力され、外部スコープで a にアクセスすると 10 が出力されます。
上記のコードがコンパイルおよび実行されると、次の結果が生成されます:
块变量: 20 外部变量: 10
クラススコープ
クラススコープとは、クラス内で宣言された変数を指します:
例
class MyClass {
public:
static int class_var; // クラススコープ変数
};
int MyClass::class_var = 30;
int main() {
std::cout << "クラス変数: " << MyClass::class_var << std::endl;
return 0;
}
上記の例では、MyClass クラス内に class_var という名前のクラススコープ変数が宣言されています。クラス名とスコープ解決演算子を使用して、::この変数にアクセスできます。main() 関数内で class_var にアクセスすると 30 が出力されます。
类变量: 30その他の拡張