4

クラスのデフォルトのコンストラクターの動作について学習しようとしていますが、この状況を把握できません。

ケース 1:

class A  
{  
  public:
     int m;
     string s;
};

次に、このクラスのオブジェクトを作成します:
a) A a; // Result: compiler initializing m with garbage value
b)A a = A(); // Result : compiler initializing m with garbage value

ケース 2:sクラスから文字列を削除しました。

class A
{
  public:
    int m;
};

a) A a; // Result: when try to access m I get run time error
b)A a = A(); //Result: m is initialized to zero

Q1) ケース 1 とケース 2 に違いがあるのはなぜですか?
Q2) どちらの場合もクラスにデフォルトのコンストラクターを提供すると、a) と b) は同じになりますか?

4

3 に答える 3

3

どちらの場合も、整数は初期化されていないためです。つまり、その値は未定義です。ゼロ、または整数が保持できるその他の値の可能性があります。

デフォルトのコンストラクターでゼロに初期化する場合は、次のようにできます。

class A
{
  public:
    A::A();
    int m;
};

A::A()
  : m( 0 )
{}

stringa はクラスであり、独自のデフォルト コンストラクターがあるため、明示的なコンストラクターを提供する必要がないことに注意してください。

于 2012-12-19T01:51:30.833 に答える
2

ケース1:クラスAは非PODです。
ケース2:クラスAはPODです。

a) A a; //This is default initialization
b) A a = A(); // This is value initialization

ケース「1」:mコンパイラーが生成したデフォルトのコンストラクターによって、ガベージ値に初期化されます。

ケース「2」:はPODであるmため、ゼロで初期化されます。A

どのシナリオでもクラッシュすることはありません。もしそうなら、おそらく壊れたコンパイラを使用しています。

デフォルトの初期化と値の初期化の詳細については、このリンクを参照してください。

于 2012-12-19T02:03:11.860 に答える
0

ケース1とケース2の唯一の違いは、ケース1では、 inが非プリミティブ型であるためclass A、コンパイラーが重要なデフォルトコンストラクターを合成することです。ただし、どちらの場合も、は初期化されていません。sclass Am

于 2012-12-19T01:59:48.717 に答える