C++ 変数スコープ

一般的に、変数を定義できる場所は3つあります:

  • 関数またはコードブロック内で宣言された変数は、ローカル変数と呼ばれます。。

  • 関数パラメータの定義で宣言された変数は、仮引数と呼ばれます。。

  • すべての関数の外部で宣言された変数は、グローバル変数と呼ばれます。。

スコープはプログラムの領域です。変数のスコープは次のように分類できます:

  • ローカルスコープ:関数内で宣言された変数はローカルスコープを持ち、関数内からのみアクセスできます。ローカル変数は関数が呼び出されるたびに作成され、関数の実行が完了すると破棄されます。

  • グローバルスコープ:すべての関数とコードブロックの外で宣言された変数はグローバルスコープを持ち、プログラム内の任意の関数からアクセスできます。グローバル変数はプログラムの開始時に作成され、プログラムの終了時に破棄されます。

  • ブロックスコープ:コードブロック内で宣言された変数はブロックスコープを持ち、コードブロック内からのみアクセスできます。ブロックスコープ変数はコードブロックが実行されるたびに作成され、コードブロックの実行が完了すると破棄されます。

  • クラススコープ:クラス内で宣言された変数はクラススコープを持ち、クラスのすべてのメンバ関数からアクセスできます。クラススコープ変数のライフサイクルはクラスのライフサイクルと同じです。

注意:内部スコープで宣言された変数が外部スコープの変数と同じ名前の場合、内部スコープの変数は外部スコープの変数を覆い隠します。

ローカル変数

関数またはコードブロック内で宣言された変数は、ローカル変数と呼ばれます。これらは関数内またはコードブロック内のステートメントでのみ使用できます。次の例ではローカル変数を使用しています:

例

#include <iostream> using namespace std; int main () { // ローカル変数の宣言 int a, b; int c; // 実際の初期化 a = 10; b = 20; c = a + b; cout << c; return 0; }

グローバル変数

すべての関数の外部で定義された変数(通常はプログラムの先頭)は、グローバル変数と呼ばれます。グローバル変数の値は、プログラムの全期間を通じて有効です。

グローバル変数は任意の関数からアクセスできます。つまり、グローバル変数は一度宣言されると、プログラム全体で使用できます。次の例では、グローバル変数とローカル変数を使用しています:

例

#include <iostream> using namespace std; // グローバル変数の宣言 int g; int main () { // ローカル変数の宣言 int a, b; // 実際の初期化 a = 10; b = 20; g = a + b; cout << g; return 0; }

プログラム内では、ローカル変数とグローバル変数の名前は同じにできますが、関数内では、ローカル変数の値がグローバル変数の値を覆い隠します。以下に例を示します:

例

#include <iostream> using namespace std; // グローバル変数の宣言 int g = 20; int main () { // ローカル変数の宣言 int g = 10; cout << g; return 0; }

上記のコードがコンパイルおよび実行されると、次の結果が生成されます:

10

ローカル変数とグローバル変数の初期化

ローカル変数が定義されたとき、システムはそれを初期化しないため、自分で初期化する必要があります。グローバル変数を定義するとき、システムは自動的に次の値に初期化します:

データ型初期化のデフォルト値
int 0
char '\0'
float 0
double 0
pointer NULL

変数を正しく初期化することは良いプログラミング習慣です。そうしないと、プログラムが予期しない結果を生むことがあります。


ブロックスコープとは、コードブロック内で宣言された変数を指します:

例

#include <iostream>

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

クラススコープ

クラススコープとは、クラス内で宣言された変数を指します:

例

#include <iostream>

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
その他の拡張