2016-11-21 5 views
-1

コンストラクタについて学習しています。明示的に、正しいユーザー定義のコンストラクタに記載のない限り、私はこれのオブジェクトが生成されるデフォルトのコンストラクタはデフォルトvlaueにmemberは初期化されません、構造体作るとき構造体のデフォルトのコンストラクタ:デフォルトの値、つまり '0'でメンバを初期化しますか?

struct MyStruct { 
int member; 
} 

:コンストラクタを指定せずに、次のように私は、構造体を構築することができますか?これは、

MyStruct object; 
cout<<object.member<<endl; 

は、実行時にそのメモリアドレスに格納されているものに応じていくつかのランダムな値を出力します。

私の最後の質問は、私は明示的に宣言し、コンストラクタを定義しない場合、私はMyStructのオブジェクトを作成したり、memberが初期化されていないままにされたときに生成コンストラクタはmemberを初期化します、ありますか?

+0

[このポスト](http://stackoverflow.com/questions/563221/is-there-an-implicit-default-constructor-in-c)を参照してください –

+0

は次のようになりますこれの複製:http://stackoverflow.com/questions/2417065/does-the-default-constructor-initialize-built-in-types – aspen100

+1

_ "A、右?はい、A.今、私の最後の質問です:何? –

答えて

3

はい、組み込み型は、コンパイラ生成コンストラクタによって初期化されません。その後、未定義の動作につながる

MyStruct.memberへのアクセス
MyStruct() {} 

コンパイラが生成コンストラクタは全く同じです。明示的memberを初期化する必要があります。

MyStruct() : member(0) {} 
+0

さらに、CppCheckなどのC++静的解析ツールを使用して、このようなエラーや間違いを見つけ出すことをお勧めします。非常に役に立ちます。 – peval27

+0

お返事ありがとうございます!これは間違いなく物事をクリアしました。 –

0

あなたが明示的に「クラスの初期化」を使用していない限り - int member = 0;またはのようなメンバーを初期化するコンストラクタを追加し、その値が未定義になります。

それは(必ずしも)実行時のメモリアドレスに格納されているものではないます。 は未定義です。あなたが確実にそれを使用することができないことを意味し、の場合を実行すると、コンパイラは "未定義の動作"を呼び出すという事実を利用し、その事実に基づいてプログラムを最適化することができます。

使用する前に、常に変数を初期化してください。

関連する問題