2017-03-06 9 views
0

次のクラス定義を考える:C++コンストラクタの暗黙のメンバー

class Foo {  
private: 
    int a; 
    int b; 

public: 
    Foo() : 
     a() 
    {} 
}; 

私が正しくリコール、私はコンストラクタを除外した場合、a()intのデフォルトコンストラクタを呼び出し、0に初期化されます、何が起こるかは未定義ですメンバー変数に追加します。しかし、この例ではbはどうですか?私のgccのバージョンでは0に設定されているようですが、それは定義された動作ですか?

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

答えて

3

bは初期化されないため、UB(未定義の動作)の原因となります。あなたのメンバーはgccによってゼロに設定されていましたが、これに頼るべきではありません。実際に

あなたは(-Wall -Wextra -Wpedantic)上のすべての警告でコンパイルする場合、gccは

warning: 'foo.Foo::b' is used uninitialized in this function 

を出してくれるの標準によると

cout << foo.b; // assuming b is public here 
0

ような何かをしようとしたとき、それは、定義されていません現在占有しているメモリブロックを占有していた値に初期化されます。ただし、一部のコンパイラーは、そのタイプの値をゼロに自動的に初期化します。

What happens to a declared, uninitialized variable in C? Does it have a value?

:この質問への受け入れ答えで

ルック

関連する問題