2014-06-10 1 views
10

Diciamo che sta creando una serie di objectes sul mucchio in questo modo:Perché C non ++ consentono `new` chiamare costruttore durante la creazione di array

myClass * objectPtr = new myClass[10]; 

new invoca solo il costruttore di default, e (sulla base degli le mie letture) non consente ad alcun altro costruttore di essere invocato.

C'è qualche logica dietro perché new non può richiamare nessun altro costruttore? Sembrerebbe meglio fare qualcosa di simile

myClass * objectPtr = new myClass[10](12); 

al contrario di

myClass * objectPtr = new myClass[10]; 
objectPtr[0] = myClass(12); 
objectPtr[1] = myClass(12); 
... 
+3

'-1' per il puntatore raw e' new' in una riga di codice. Anche la domanda non è particolarmente ragionevole, considerando che non sta solo usando puntatori grezzi, decadimento e allocazioni inutili, ma si concentra anche sulla creazione di array C grezzi che è sostanzialmente discutibile. IOW la risposta potrebbe essere "perché non usare i C array" (e tutte le cose di cui sopra). –

+2

FWIW, si può fare ciò con 'std :: vector', ad esempio' std :: vector foo (10, myClass (12)); ' – AndyG

+0

_'Perché C++ non consente a' new' di chiamare il costruttore durante la creazione di array '_ Perché questo non si adatta alla sintassi effettiva dell'operatore 'new []()'. –

risposta

15

Perché C++ non permette new alla chiamata del costruttore durante la creazione di array

Lo fa. E 'solo un po' noioso:

struct my_class 
{ 
    my_class() {} 
    my_class(int, int) {} 
}; 

int main() 
{ 
    my_class* objectPtr = new my_class[3]{my_class(1,2), 
             my_class(), 
             my_class(3,4)}; 
} 
+2

Costruisce sul posto o invoca un operatore di copia sugli oggetti creati? –

+0

Tranne se dichiarate un array di 100 oggetti, digitate manualmente 'my_class (a, b)' 100 volte. Supponendo che stai inizializzando tutti gli oggetti creati con gli stessi campi, c'è una ragione per cui il C++ non ha notazioni abbreviate per questo? – 1110101001

+2

@ user2612743 Ecco perché ho detto "noioso". Posso solo speculare sul motivo, e questo sarebbe che la gente non dovrebbe usare questa roba comunque, ma 'std :: vector '. – juanchopanza

-2

Di solito non si vuole costruire lo stesso oggetto più volte, quindi si costruisce molti oggetti predefiniti e con un ciclo for è possibile cambiarli alle proprie esigenze.

Un altro modo è possibile utilizzare è:

myClass **ObjectPointers = new myClass*[NUMBER_OF_OBJECTS]; 
for (int i=0; i<NUMBER_OF_OBJECTS; ++i) 
    ObjectPointers[i] = new myClass(1,2,3,...); # <-- non-default constructor 

In questo modo si allocare dinamicamente puntatori a oggetti che si possono costruire separatamente.

+3

-1: Questo mi ricorda come ho scritto il mio codice quando ero abbastanza giovane, dopo aver letto il mio primo e unico libro "teach-me-C++" che ho un po 'frainteso a causa della precedente conoscenza di C. Per favore, seriamente, leggi almeno su std :: vectors, std :: lists e smartpointers prima di tornare al C++. Credimi, ti farà risparmiare un sacco di mal di testa – quetzalcoatl

+0

So tutto delle librerie STL, grazie. Tuttavia, sono uno studente di Informatica e quando pratichiamo codice C++ ci viene chiesto di non usare STL. Sono completamente d'accordo però. – user3175215