人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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()を抜けます!
プログラムが終了します!
デストラクタが呼び出されました!
デストラクタが呼び出されました!

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

●質問者: gbs01
●カテゴリ:コンピュータ 学習・教育
✍キーワード:3B C++ クタ コンストラクタ コード
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● Mook
●60ポイント ベストアンサー

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

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

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


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

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

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


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

わけではありません。

func 呼び出し
 a = 123
 a++ (⇒124)
func 呼び出し
 a (⇒ 124)
 a++ (⇒125)
func 呼び出し
 a = 123
 a++ (⇒124)
func 呼び出し
 a =123
 a++ (⇒124)

となります。


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


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

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

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

◎質問者からの返答

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

//list7-3b.cppでは、

namespace

{

MyClass a;

}

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

そのため

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ