2010-08-26 3 views
23

Quando uso nuovo [] per creare un array dei miei corsi:Il nuovo [] chiama il costruttore predefinito in C++?

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

vedo che chiama un costruttore di default di Acount volte. Di conseguenza arr ha oggetti inizializzati count di tipo A. Ma se io uso la stessa cosa per la costruzione di un array int:

int *arr2 = new int[count]; 

non è inizializzato. Tutti i valori sono qualcosa come -842150451 sebbene il costruttore predefinito di int assegni il suo valore a 0.

Perché c'è un comportamento così diverso? Un costruttore predefinito non viene chiamato solo per i tipi predefiniti?

+0

Eventuali duplicati di [Come posso fare \ 'nuova \ [\] \' default-inizializzare l'array di tipi primitivi?] (Https : //stackoverflow.com/questions/2468203/how-can-i-make-new-default-initialize-the-array-of-primitive-types) – Suma

risposta

41

Vedere the accepted answer a a very similar question. Quando si utilizza new[] ogni elemento viene inizializzato dal costruttore predefinito tranne quando il tipo è un tipo predefinito. I tipi predefiniti vengono lasciati unificati per impostazione predefinita.

di aver costruito in matrice di tipo di difetto di uso-inizializzato

new int[size](); 
+12

Wow, in realtà non sapevo che si potevano aggiungere le parentesi per inizializzare i tipi predefiniti. Ho lavorato con C++ per anni. È eccitante o molto triste! – aardvarkk

3

I tipi predefiniti non hanno un costruttore predefinito anche se in alcuni casi possono ricevere un valore predefinito.

Ma nel tuo caso, lo new assegna appena sufficiente spazio in memoria per memorizzare gli oggetti countint, ad es. assegna sizeof<int>*count.

+0

Questo non è un vero costruttore, ma un modo per inizializzarli. .. –

+2

boots @rubber: 'int i();' non inizializza un varaible chiamato 'i'. Dichiara una funzione 'i' che restituisce un int. Potresti aver inteso 'int i = int();' –

+1

@James: In C++ 0x puoi finalmente dire cosa intendi: 'int x {};' :) – fredoverflow

0

int non è una classe, è un tipo di dati incorporato, pertanto non viene chiamato alcun costruttore.