2017-01-23 9 views
0

私はC++プログラミングとプログラミング自体が新しく、C++コードのVisualスタジオコンパイラの予想される動作に精通しています。 (Visual Studioの2015) ローカル変数オブジェクトのVisual Studio C++コンパイラの奇妙な振る舞い

class aClass { 

    public: 
    int a; 
    int b; 
} 

次に、機能ブロックの内部、私はこのクラスのオブジェクトを宣言するとき:

aClass obj; 
cout << obj.a; 

その後、I文字通り1時間変数の値としてランダムなRAMの内容を取得し、それ以外のときはコンパイルエラーが発生します:ローカル変数は初期化されていません。 (コンパイラが一度エラーを克服したときに、それがエラーを克服し、初めて前にそれを繰り返して複数回を保つかもしれませんが、特に、それは、再びそれを繰り返したことがない!)

オブジェクトを宣言するのがベストプラクティス上の任意のアドバイスは、

一貫性のある結果を得るには、aClass obj = aClass();のフォームを使用してください。

または関連性のある意見。前もって感謝します。

+0

あなたのクラスには、メンバー変数を初期化するコンストラクタがありません。 –

+0

実行時有効期間を持つ変数は、デフォルトでは初期化されません。 – George

+0

_whileコンパイルエラーが発生する:ローカル変数が初期化されていません_正しく覚えていれば、エラーではなく警告です。 –

答えて

5

クラスまたは構造体から変数を宣言すると、オブジェクトが構築されますが、内部のデータは自動的に初期化されません。データを初期化するのはあなた次第です。

初期化せずに、あなたのメンバ変数の値が不定なると(でも彼らからの読み取り)どのような方法でそれらを使用しますが未定義の動作です。

クラスや構造によっては、データを初期化する方法が異なります。コンストラクタが定義されている場合は、コンストラクタの初期化子リストを使用することをお勧めします。あなたは(あなたのコードに示したような)POD型の構造を持っている場合は、単にどのように未定義の動作を呼び出しについてない

aClass obj = {}; // Basically the same as `aClass obj = aClass()` 
+0

私は明示的にクラス内のデフォルトのコンストラクタを宣言する方法で答えてくれてありがとう、宣言されたオブジェクトは、デフォルトのコンストラクタによって初期化されるだろうが、これは自動デフォルトのコンストラクタでは当てはまりません。実際には愚かな質問ではありませんでしたが、デフォルトのコンストラクタは、コンパイラが提供するときとは違う動作をしているようです。そして、いつものように急いで読んでいる人は、質問のポーズの「十分な認識がない」という反応を意味する間違った答えを返す。この答えを含んでいません。ありがとうございます。 – Physician

+0

@Physician小さな説明:コンストラクタを定義すると、それだけではメンバー変数を初期化できません。明示的に初期化する必要があります(順番にメンバーを初期化するコンストラクタ)。 –

+0

ええ、私は貴重な助言としてそれを取るでしょう、間違いなく。しかし、実際には、クラス型に明示的なデフォルトのコンストラクタがある場合、明示的な初期化子を伴わずに文((型識別子;))を書くことは決してコンパイラによって「初期化されない」とみなされることはありません。 – Physician

1

Any advice on best practice of declaring objects

はいのような何かを行うことができますか?初期化されていない変数から読み込んでいます。コンパイラがそれを検出することもありますが、しばらくしていないと、ゴミが出てきます。

これはどのように処理しますか? 変数を読み込む前に変数を初期化してください!