変数の値はいつまでも有効であるとは限りません。それは前からずっと言っていることですね。では、変数の値はそれぞれいつまで有効なのでしょうか? 今回はそれについて詳しく話してみたいと思います。前章に続き地味な内容が続きますが、まぁ、勘弁して下さい(笑)。
では、今回の要点です。
では、いってみましょう。
変数はそれぞれ有効期間を持っています。例えば、グローバル変数はプログラムが実行されている間はずっと有効ですし、内部変数は関数を抜けるまでのみ有効です。このような、変数の有効期間を寿命と呼びます。
しかし、実は、内部変数の寿命は全て同じとは限りません。このことは追って話します。その前に、第9章の内容を突き詰めていこうと思います。
第9章では、どの変数がどこで使えるかを見ました。実はこれでは不十分なのです。
例えば、次のプログラムをコンパイルしてみて下さい。コンパイルエラーが出ます。
プログラム | コンパイルエラー |
---|---|
// Scope1.cpp #include <iostream.h> int main() { { int a = 0; cout << a << endl; } cout << a << endl; return 0; } |
Scope1.cpp(10) : error C2065: 'a' : 定義されていない識別子です。 |
何と、{ } で囲まれた中では a は使えたのに、{ } を抜けたとたん変数が使えなくなってしまいました。つまり、{ } を抜けると変数は使えなくなってしまうわけです。
この { } で囲まれた範囲をブロックといいます。そして、変数や関数などの見える範囲のことをスコープ(scope : 視野)と呼びます。例えば、内部変数のスコープは宣言から、そのブロックの終わりまでということになります。
では、グローバル変数のスコープはどうなるのでしょうか? グローバル変数はどのブロックの中にもなく、ファイル上に直接乗っかっているので、ファイルスコープにあるといいます。一方、ブロック内に限定されているスコープをブロックスコープといいます。
で、自動変数の寿命はスコープ内のみです。そして、ファイルスコープにあるもの、もしくは静的内部変数の寿命は、プログラムが始まってから終わるまでです。
こうやって文字でいろいろ書いていると何か難しそうですが、よく考えてみれば何も難しいことはなく、むしろ自然なことしか言っていないことが分かります。
次は、同じ名前の別の変数についてです。
実は、ブロックが違えば、同じ名前の別の変数を作ることができます。確かに別の関数で同じ名前の別の変数を作ることは今まででもやってきましたが、これは同じ関数内でも実現できるのです。
では、次のプログラムを見て下さい。
プログラム | 実行結果例 |
---|---|
// Scope2.cpp #include <iostream.h> int a = 1; int main() { cout << a << " : " << &a << endl; int a = 2; cout << a << " : " << &a << endl; { int a = 3; cout << a << " : " << &a << endl; } cout << a << " : " << &a << endl; return 0; } |
1 : 0x00427D50 2 : 0x0065FDF4 3 : 0x0065FDF0 2 : 0x0065FDF4 |
今回の変数は全て a です。で、4箇所で a と a のアドレスを表示しています。
このことから分かるとおり、同じ名前の変数が何個もあったときは、最も内側のブロックにある変数が使われます。
ただ、同じ名前の変数を同じ関数内で2個以上作ると、プログラムが読みにくくなります。ただできるというだけで、実際に使うことはないでしょう。
ここで、C++ではグローバル変数ならどのスコープからでも参照することができます。それには、スコープ解決演算子 :: というものを使います。コロン (:) 2つです。
変数の前に :: を付ければ、それはグローバル変数を指すようになります。上の最後の cout を次のように変えてみて下さい。
cout << ::a << " : " << &::a << endl;
これで、最後の表示がグローバル変数のものになると思います。
では、今回の要点です。
今回は用語が沢山出てきてしんどかったです。ですが、大切なのは用語より内容なので、用語は、まぁ、また出てきたときにここで確認したので構わないでしょう。
次回はファイルを越えての変数や関数の使い方についてのお話です。それでは、次回まで。
Last update was done on 2000.7.28
この講座の著作権はロベールが保有しています