C++言語初心者です。よろしくお願いします。


//list7-3.cpp
http://d.hatena.ne.jp/gbs01/20090617/1245193499
の実行結果は
プログラムが起動しました!
func()が呼び出されました!
静的変数の値:123
コンストラクタが呼び出されました!
メンバ変数の値:456
func()を抜けます!
func()が呼び出されました!
静的変数の値:124
メンバ変数の値:457
func()を抜けます!
プログラムが終了します!
デストラクタが呼び出されました!

となります。
ところが、
//list7-3b.cpp
http://d.hatena.ne.jp/gbs01/20090617/1245193498
の実行結果は
引数のないコンストラクタが呼び出されました!
プログラムが起動しました!
func()が呼び出されました!
静的変数の値:123
引数を持つコンストラクタが呼び出されました!
メンバ変数の値:456
func()を抜けます!
func()が呼び出されました!
静的変数の値:123
メンバ変数の値:457
func()を抜けます!
プログラムが終了します!
デストラクタが呼び出されました!
デストラクタが呼び出されました!

となります。コードの何が原因でこのような結果になるのでしょうか。
どなたかご教示お願いいたします。

回答の条件
  • 1人5回まで
  • 登録:2009/06/17 08:09:47
  • 終了:2009/06/17 11:03:12

ベストアンサー

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912009/06/17 09:16:58

ポイント60pt

おそらくは変数のスコープに関して質問されていると思うのですが、

(違った場合はコメントください。)

関数内で static で宣言された変数は、関数が終了しても内容が保持されます。


変数宣言で初期化された値は、関数が呼び出されるごとに初期化はさるわけでは

なく、プログラム起動時にその値として初期化され、動作中で変更されると、終了

まで変更後の値が保持されます。


ですから、前者はプログラムの関数呼び出しの度に変数が初期化される

わけではありません。

  • a が static 変数の場合
func 呼び出し
   a = 123
   a++ (⇒124)
func 呼び出し
   a (⇒ 124)
   a++ (⇒125)
  • a が local 変数の場合
func 呼び出し
   a = 123
   a++ (⇒124)
func 呼び出し
   a =123
   a++ (⇒124)

となります。


クラスモジュールに関しても同様です。


このあたりは、正確に挙動を理解しないとバグのもととなりますので、変数スコープに関しては

理解を深めておくとよいかと思います。

http://www.geocities.jp/ky_webid/c/022.html

id:gbs01

回答ありがとうございます。

//list7-3b.cppでは、

namespace

{

MyClass a;

}

があるために、これが引数のないコンストラクタとして認識されるということでしょうか?

そのため

プログラムが起動しました!

の前に、コンストラクタが呼び出されるという理解でよろしいでしょうか?

2009/06/17 09:30:14
  • id:Mook
    今回の例では、global な静的変数、名前空間の変数は main 実行前にインスタンスが生成されて
    いますので、そのような挙動になります。

    main の直前に
    MyClass b;
    と追加すれば、こちらも main 実行前にコンストラクタが起動します。
  • id:gbs01
    コメントありがとうございます。

    main()の後ろに
    namespace
    {
    MyClass a;
    }

    と書いてあるのですが、この場合も、main実行前にインスタンスが生成されていると考えて
    良いのでしょうか?

    コメント欄じゃなくて、回答欄に書き込んでいただいて結構です。ポイントが渡せなくなりますので。
  • id:gbs01
    たぶん理解できたと思います。
    ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません