std::string s = std::string("foo");
Questo crea un oggetto temporaneo std::string
contenente "pippo", quindi assegna a s
. (Si noti che i compilatori possono elidere la temporanea. L'elison temporanea in questo caso è esplicitamente consentito dalla norma C++.)
std::string s = new std::string("foo");
Si tratta di un errore di compilazione. L'espressione new std::string("foo")
crea un std::string
nel negozio gratuito e restituisce un puntatore a std::string
. Quindi tenta di assegnare il puntatore restituito di tipo std::string*
a s
di tipo std::string
. Il design della classe std::string
impedisce che ciò accada, quindi la compilazione fallisce.
C++ non è Java. Questo non è il modo in cui gli oggetti vengono in genere creati, perché se si dimentica dil'oggetto std::string
restituito si perde memoria. Uno dei principali vantaggi dell'utilizzo di std::string
consiste nel fatto che gestisce automaticamente il buffer di stringa sottostante, quindi new
-in questo tipo di sconfitte.
std::string s = "foo";
Questo è essenzialmente lo stesso come # 1. Inizializza tecnicamente una nuova stringa temporanea che conterrà "pippo", quindi la assegna a s
. Di nuovo, i compilatori in genere elideranno il temporaneo (e in effetti praticamente tutti i compilatori non stupidi oggigiorno di fatto eliminano il temporaneo), quindi in pratica costruisce semplicemente un nuovo oggetto chiamato s
sul posto.
In particolare richiama un costruttore di conversioni in std::string
che accetta un argomento const char*
. Nel codice precedente, il costruttore di conversione deve essere non-explicit
, altrimenti si tratta di un errore del compilatore. Il costruttore di conversione è in realtà non- explicit
per std::string
s, quindi quanto sopra viene compilato.
In questo modo vengono in genere inizializzati gli std::string
s. Quando lo s
esce dal campo di applicazione, l'oggetto s
verrà distrutto insieme al buffer di stringa sottostante. Si noti che quanto segue ha lo stesso effetto (ed è un altro modo tipico in cui vengono inizializzati i valori std::string
), nel senso che produce anche un oggetto chiamato s
contenente "pippo".
std::string s("foo");
Tuttavia, there's a subtle difference between std::string s = "foo";
and std::string s("foo");
, uno dei quali è che il costruttore di conversione può essere explicit
o non explicit
nel caso precedente.
Nota che in genere si desidera utilizzare l'opzione 4: 'std :: string s (" foo ");' –
@JerryCoffin: come è diverso dall'opzione 3? –
@MikeSeymour: esegue l'inizializzazione diretta anziché l'inizializzazione della copia. Almeno concettualmente, # 3 crea una stringa temporanea inizializzata dalla costante fornita, quindi usa il costruttore di copie per creare 's' da quel valore (sebbene, ammettiamolo, il compilatore di solito lo ometterà e farà l'equivalente dell'inizializzazione diretta). –