web-dev-qa-db-ja.com

new []はC ++でデフォルトのコンストラクターを呼び出しますか?

New []を使用してクラスの配列を作成すると、次のようになります。

int count = 10;
A *arr = new A[count];

Acount回のデフォルトコンストラクターを呼び出すことがわかります。その結果、arrにはタイプcountA初期化オブジェクトがあります。しかし、同じものを使用してint配列を作成すると、次のようになります。

int *arr2 = new int[count];

初期化されていません。 intのデフォルトコンストラクタはその値を-842150451に割り当てますが、すべての値は0のようなものです。

なぜそんなに異なる振る舞いがあるのですか?デフォルトのコンストラクターは、組み込み型に対してのみ呼び出されませんか?

34
flashnik

受け入れられた回答 から 非常によく似た質問 を参照してください。 new[]を使用すると、型が組み込み型の場合を除いて、各要素はデフォルトのコンストラクターによって初期化されます。組み込みタイプは、デフォルトで単一化されたままになっています。

組み込み型の配列をデフォルトで初期化して使用するには

new int[size]();
55
sharptooth

組み込み型には、場合によってはデフォルト値を受け取ることができますが、デフォルトのコンストラクターはありません。

しかし、あなたの場合、newは、countintオブジェクトを格納するのに十分なスペースをメモリに割り当てるだけです。 sizeof<int>*countを割り当てます。

3
Cedric H.

intはクラスではなく、組み込みのデータ型であるため、コンストラクターは呼び出されません。

0
Hamid Nazari