2010-02-03 8 views

risposta

26

Sì e No.

La prima viene inizializzato in modo esplicito, e il secondo è copiare inizializzato. Gli standard permettono di sostituire il secondo con il primo. In pratica, il codice prodotto è lo stesso.

Ecco cosa accade in poche parole:

std::string s1("foo"); 

Il costruttore stringa della forma:

string (const char * s); 

è conseguente s1.

Nel secondo caso. Viene creato un temporaneo e il costruttore earler menzionato viene chiamato per quel temporaneo. Quindi, viene invocato il costruttore della copia. ad esempio:

string s1 = string("foo"); 

In pratica, la seconda forma è ottimizzata, per essere della forma della prima. Non ho visto un compilatore che non ottimizzi il secondo caso.

+0

Il costruttore di copia non verrà richiamato nel secondo caso, viene chiamata solo stringa (const char * s). Questa è l'inizializzazione della copia. Verifica: [how-c-implicitly-convert-c-style-string-to-a-string-object] (http://stackoverflow.com/questions/35568612/how-c-implicitly-convert-c-style- string-to-a-string-object) – expoter

3

non c'è alcuna differenza

-5

Il primo è migliore.

Il secondo crea l'istanza e assegna il valore predefinito (""). Poi ci sarà un incarico di secodn: "foo". Quindi 2 assegnazioni invece di 1 ...

+7

No, il secondo non chiama l'operatore di assegnazione. –

13

Sulla faccia di esso, il primo si chiama il costruttore const char* per inizializzare s1. Il secondo utilizza il costruttore const char* per inizializzare un valore temporaneo e quindi utilizza il costruttore di copie, passando un riferimento a quel valore temporaneo, per inizializzare s2.

Tuttavia, lo standard permette esplicitamente una cosa chiamata "copia elisione", il che significa che, come dice Arak, il secondo può essere legalmente sostituito con il primo anche se il costruttore di copia ha osservabili effetti collaterali, in modo che il cambiamento influisce sull'output del programma.

Tuttavia, quando viene eseguita questa sostituzione, il compilatore deve ancora verificare che la classe abbia un costruttore di copia accessibile. Quindi una potenziale differenza è che il secondo modulo richiede che un costruttore di copie sia richiamabile, anche se il compilatore non deve chiamarlo. Ovviamente lo std::string ne ha uno, quindi in questo caso ciò non fa differenza, ma per altre classi potrebbe.

+1

Hai ottenuto il mio +1 per "lo standard consente esplicitamente qualcosa chiamato" copia elision ";) – AraK

+0

Confessione minore: dopo la pubblicazione ho notato che è" copia costruttore elision "nell'indice, ma per quanto mi ricordo di averlo fatto riferimento come "copia elision" :-) –

Problemi correlati