La new
parola chiave in lingue come Java, Javascript e C # crea una nuova istanza di una classe.
Questa sintassi sembra essere stata ereditata dal C ++, dove new
viene utilizzata specificamente per allocare una nuova istanza di una classe sull'heap e restituire un puntatore alla nuova istanza. In C ++, questo non è l'unico modo per costruire un oggetto. Puoi anche costruire un oggetto nello stack, senza usare new
- e in effetti, questo modo di costruire oggetti è molto più comune in C ++.
Quindi, proveniente da uno sfondo C ++, la new
parola chiave in lingue come Java, Javascript e C # mi è sembrata naturale e ovvia per me. Poi ho iniziato a imparare Python, che non ha la new
parola chiave. In Python, un'istanza viene costruita semplicemente chiamando il costruttore, come:
f = Foo()
All'inizio, questo mi è sembrato un po 'off, fino a quando mi è venuto in mente che non c'è motivo per Python di avere new
, perché tutto è un oggetto, quindi non c'è bisogno di chiarire le varie sintassi dei costruttori.
Ma poi ho pensato: qual è davvero il punto new
in Java? Perché dovremmo dirlo Object o = new Object();
? Perché non solo Object o = Object();
? In C ++ ce n'è sicuramente bisogno new
, dal momento che dobbiamo distinguere tra allocazione sull'heap e allocazione sullo stack, ma in Java tutti gli oggetti sono costruiti sull'heap, quindi perché anche avere la new
parola chiave? La stessa domanda potrebbe essere posta per Javascript. In C #, che conosco molto meno, penso che new
possa avere qualche scopo in termini di distinzione tra tipi di oggetto e tipi di valore, ma non ne sono sicuro.
Indipendentemente da ciò, mi sembra che molti linguaggi che sono venuti dopo il C ++ semplicemente "ereditassero" la new
parola chiave, senza realmente averne bisogno. È quasi come una parola chiave vestigiale . Sembra che non ne abbiamo bisogno per nessun motivo, eppure è lì.
Domanda: ho ragione su questo? O c'è qualche motivo convincente che new
deve essere in C ++ - ispirato ai linguaggi gestiti dalla memoria come Java, Javascript e C # ma non Python?
f
non sfugge alla funzione, alloca lo spazio dello stack.
f
quando ritorna la funzione che racchiude.
new
parola chiave. Ovviamente voglio creare una nuova variabile, stupido compilatore! Un buon linguaggio sarebbe a mio parere hanno una sintassi similef = heap Foo()
,f = auto Foo()
.