2009-12-11 17 views
97

Che differenza c'è tra "nuovo operatore" e "operatore nuovo"?Differenza tra "nuovo operatore" e "operatore nuovo"?

+3

Ciao, puoi chiarire la domanda? Sembra che ci sia errore di battitura da qualche parte. –

+10

La domanda è formulata correttamente, vedere le risposte di seguito. Il metodo per allocare dinamicamente la memoria è usare l'operatore 'new'. Questo operatore può essere sovraccaricato. Per distinguere tra l'operatore predefinito e una versione sovraccaricata, il valore predefinito è chiamato "nuovo operatore" e la versione sovraccaricata si chiama "operatore nuovo". –

+2

Come farlo. Sono nuovo e inconsapevole. – Sandeep

risposta

103

Di solito provo a esprimere le cose in modo diverso per distinguere tra i due un po 'meglio, ma in ogni caso è una buona domanda.

L'operatore nuovo è una funzione che assegna la memoria grezza - almeno concettualmente, non è molto diverso da malloc(). Anche se è abbastanza insolito a meno che non si sta scrivendo qualcosa come il proprio contenitore, è possibile chiamare operatore di nuovo direttamente, come:

char *x = static_cast<char *>(operator new(100)); 

E 'anche possibile sovraccaricare operatore nuovo sia a livello globale, o per una classe specifica. IIRC, la firma è:

void *operator new(size_t); 

Naturalmente, se si esegue l'overload un operatore nuovo (sia globale o per una classe), dovrete anche/bisogno di sovraccaricare l'operatore di corrispondenza cancellare pure. Per quello che vale, c'è anche un operatore separato new [] che è usato per allocare memoria per gli array - ma è quasi certamente meglio ignorare completamente tutto quel casino.

Il nuovo operatore è quello che normalmente si usa per creare un oggetto dal negozio libera:

my_class *x = new my_class(0); 

La differenza tra i due è che il gestore nuova solo alloca la memoria cruda, nient'altro. Il nuovo operatore inizia usando l'operatore new per allocare la memoria, ma poi invoca il costruttore per il giusto tipo di oggetto, quindi il risultato è un vero oggetto live creato in quella memoria. Se quell'oggetto contiene altri oggetti (sia incorporati che come classi base) anche quei costruttori come invocati.

+14

+1, per quanto riguarda un fraseggio diverso, lo standard usa * nuova espressione * tutto intorno, e solo una volta usa * nuovo operatore * per riferirsi al luogo di chiamata. Tendo a fare lo stesso: * operatore nuovo * per l'* allocatore * e * nuova espressione * per l'uso. –

+3

Una nuova espressione è l'intera frase che inizia con il nuovo. Quindi, come si chiama solo la parte "nuova" di esso? Se è sbagliato chiamare questo nuovo operatore, non dovremmo chiamare "sizeof" l'operatore sizeof, o l'operatore address-of (quando si comporta come uno). – Kaz

+1

Seguendo l'osservazione di Kaz, forse la domanda dovrebbe essere riformulata come, qual è la differenza tra il nuovo operatore e l'operatore nuovo operatore? :) –

6

Quando si crea un nuovo oggetto la memoria è allocata utilizzando operatore nuovo poi il costruttore viene invocato per inizializzare la memoria. Il nuovo operatore esegue sia l'allocazione che l'inizializzazione, mentre l'operatore nuovo fa solo l'allocazione.

20

segue è la citazione dal più efficace C++ libro di Scott Meyers:

Il nuovo operatore chiama una funzione per eseguire il requisito di allocazione della memoria , e si può riscrivere o overload che funzione per modificare la sua comportamento. Il nome della funzione che il nuovo operatore chiama per allocare la memoria è un operatore nuovo.

+6

Il termine è ovviamente inventato dall'autore del libro (o, forse, preso in prestito da qualche fonte obsoleta). Nella nomenclatura formale del C++ non esiste un termine come "nuovo operatore". – AnT

+2

@AndreyT: ho eseguito una ricerca del C++ 11 per "nuovo operatore" e l'ho trovato referenziato in quattro punti.Nello specifico, due riferimenti al "placement new operator" –

29
"operatore nuovo"

class Foo 
{ 
public: 
     void* operator new(size_t); 
} 

"nuovo operatore":

Foo* foo = new Foo(); 

In questo esempio, new Foo() chiamate Foo::operator new()

In altre parole, "nuovo operatore" chiama " operator new() "proprio come l'operatore + chiama operator +()

+11

'new' non sono un operatore in C++. 'sizeof', ad esempio, è un operatore, ma' new' e 'delete' no. 'new' e' delete' sono le parole chiave ei costrutti sintattici che queste parole chiave formano sono chiamati * new-expression * e * delete-expression *. – AnT

+2

Uh, se possibile, 'sizeof' è il costrutto sintattico, e' new' e 'delete' sono entrambi operatori validi, legali, in grado di sovraccaricare. Da tutto ciò che ho visto, 'new' e' delete' sono entrambi operatori. Vedi [cplusplus.com] [http://cplusplus.com/doc/tutorial/classes2/] –

+0

Whoops. Link fallito. Ecco il raw: http://cplusplus.com/doc/tutorial/classes2/ –

8

Non c'è differenza tra "nuovo operatore" e "operatore nuovo". Entrambi si riferiscono alla stessa cosa: la funzione operator new sostituibile/sostituibile che esegue in genere allocazione di memoria non elaborata per oggetti creati da nuove espressioni.

Nota anche che termine è presente nella specifica lingua (che è la fonte di definizione della terminologia ufficiale).

Quando si utilizza new nel programma per creare un oggetto, viene chiamato nuova espressione. Nuova espressione composta da parola chiave new e parti sintattiche aggiuntive definite dalla grammatica. Nessuna parte della sintassi di questa espressione viene mai definita "operatore".

La funzione di allocazione della memoria non elaborata operator new è denominata solo "funzione operator new". Si noti che le parole operator e new in questa sequenza sono solo due parole chiave in linguaggio C++ separate. Non formano un termine inglese "operatore nuovo". In nessuna parte delle specifiche del linguaggio troverai riferimenti a "operatore nuovo" come termine inglese. Ogni volta questa è solo una combinazione di due parole chiave indipendenti che producono una sintassi di dichiarazione per una funzione di allocazione di memoria.

Ancora una volta, nel riprendere: formalmente in C++ non esistono termini di lingua inglese come "operatore nuovo" o "nuovo operatore". La sequenza precedente è presente nelle specifiche del linguaggio come una semplice combinazione di parole chiave, non come termine inglese. Quest'ultimo non è affatto presente.

+14

Ti sembra perso in qualche pedante masturbazione mentale. Lo standard è vago in punti, e questo è uno di loro. È altrettanto sensato "discutere il nuovo operatore" come "discutere l'operatore più" o "discutere l'operatore +". –

+0

AnT - Sono assolutamente d'accordo con te (+1) – Belloc

2

Il nuovo operatore: C++ supporta l'allocazione dinamica degli oggetti utilizzando il nuovo operatore. Il nuovo operatore assegna la memoria per gli oggetti da un pool chiamato free store. Il nuovo operatore chiama l'operatore della funzione speciale nuovo.

esercente nuovo: Se la richiesta è per zero byte di archiviazione, operatore nuovi restituisce un puntatore a un oggetto distinto (cioè, chiamate ripetute a new operatore ritorno puntatori diversi). Se la memoria richiesta non è sufficiente, l'operatore new restituisce NULL o genera un'eccezione. Il primo argomento per l'operatore new deve essere di tipo size_t (un tipo definito in STDDEF.H) e il tipo restituito è sempre void *.

ecco un link MSDN per ulteriori dettagli: domanda

The operator new Function

The new Operator

+1

Chiaro chiarimento: l'operatore non collocatore nuovo deve sempre lanciare sul fallimento dell'allocazione (secondo lo standard); e i moduli di posizionamento, come ':: new (std :: nothrow)', possono fare entrambi (quell'esempio specifico restituisce un puntatore nullo). –

3

del PO non è formulata in modo corretto. È meglio passare come 'Differenza tra' operatore nuovo 'e' nuova espressione '?' Nota: 'operator new' fa spesso riferimento anche a 'operator new function'.

E ci sono un sacco risposta corretta in giro, qui di seguito è mio:

1> 'nuova espressione' chiamano 'operatore nuovo' per allocare la memoria grezzo, quindi chiamare il costruttore

apple * p = new apple(); //new expression 

2> 'operatore nuovo' allocare memoria di sola grezzo, non molta differenza di malloc

void* mem = operator new(sizeof(apple)); //just like calling malloc() 
apple* p2 = new(mem) apple(1); //call construct here using placement new. 
1
  1. nuovo è un operatore nonché una parola chiave.

    vedere [1] in 2.13 & & In 2.12.

  2. nuovo fa due cose: T * t = new T (arg);

    1) allocare memoria per l'oggetto: void * ptr = operatore new (sizeof (T));

    // operatore nuovo è una funzione (proprio come malloc in c), non un operatore. (Vedere [1] in 3.7.4). Ma l'articolo 7 [2] ha detto che è anche un operatore. A mio parere, la differenza tra operatore e funzione è piccola e si può vedere quando si ricorda che l'operatore di overload è implementato dalle funzioni.

    // possiamo sovraccaricare questo operatore/funzione (operatore nuovo) facendo ciò che vogliamo proprio qui.

    2) inizializzare l'oggetto nella memoria allocata: chiamare T :: T (arg) sul PTR

    // solo compilatore può fare questo. Né io né tu puoi.

    // anche il compilatore invocherà i costruttori degli oggetti membri e il costruttore della classe base se T li ha. E questa invocazione è ricorsiva. Solo il compilatore può farlo.

  3. Quindi, l'operatore nuovo fa parte delle missioni di nuovo, e solo in questa parte possiamo fare qualcosa.

    [1]: ISO/IEC, N3690. http://ww.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf

    [2]: Meyers, Scott. C++ efficace, 3 °.

Problemi correlati