class A
{
static int i;
A()
{
System.out.println(++i);
}
public static void main(String h[])
{
A obj[] = new A[30];
}
}
obj[30] = 新しい A[30]; :- この行は、デフォルトのコンストラクターを 30 回呼び出す必要がありますか?
class A
{
static int i;
A()
{
System.out.println(++i);
}
public static void main(String h[])
{
A obj[] = new A[30];
}
}
obj[30] = 新しい A[30]; :- この行は、デフォルトのコンストラクターを 30 回呼び出す必要がありますか?
この線
A obj[30] = new A[30];
のコンストラクターを呼び出しませんA
。への30 のインスタンス化されていない参照を作成しA
ます。
30 個のオブジェクト参照をインスタンス化するには、次を使用できます。
A obj[] = { new A(), new A(), ..28 more ->
};
この場合、要素の数を考えると、以下のようになります。
for (int i=0; i < obj.length; i++) {
obj[i] = new A();
}
30
配列サイズ宣言での の最初の使用は不正であることに注意してください。
A obj[30] = new A[30];
^
いいえ、この行はコンストラクターをまったく呼び出しません。type の 30 要素の長さの配列を作成するだけA
です。配列の各要素はnull
.
やりたいことを正確に行う方法はありませんが、デフォルトのコンストラクターを 30 回呼び出す非常に近い 2 つのことを次に示します。
A *obj = new A[30];
また
A obj[30];
最初の回答は、ヒープ上に 30 個の A オブジェクトの配列を作成し、それぞれの既定のコンストラクターを呼び出します。obj はスタック上にないため、この関数の呼び出し元に戻すことができます。問題は、obj に A[30] の型がなくなったため、 sizeof(obj) が元の質問のコードとは異なることです。(「delete」だけでなく、obj には「delete []」を使用する必要があることに注意してください。)
2 番目の答えは、スタック上に 30 個の A オブジェクトの配列を作成します。これで、コンパイラは obj に 30 個の要素があることを理解し、 sizeof(obj) は質問と同じになります。ただし、obj は、この関数 (またはそれが呼び出す関数) 内でのみ使用できます。これは、関数が戻ると、スタックから削除され、プロセスで 30 個のデストラクタが呼び出されるためです。(ローカル変数のみです。)
C++ (または任意の優れたオブジェクト指向言語) では、オブジェクトの作成は常に、スペースの割り当てとコンストラクターの呼び出しの両方を意味します。そうしないと、本当に便利なオブジェクトがありません。そのため、サポートされている方法 (ローカル変数または C++ の "new") でオブジェクトが作成されると、作成してアクセスできるようになったすべてのオブジェクトに対して常に既定のコンストラクターが呼び出されます。(デフォルトのコンストラクターがない場合、どちらの回答もコンパイルされないことに注意してください!)