2013-02-04 9 views
5

Se non ho intenzione di modificare una stringa, allora è la prima opzione migliore o entrambe sono uguali- (Voglio solo scorrere la stringa, ma poiché la dimensione della stringa è grande, non voglio che venga eseguita la copia locale .)stringa come parametro?

int getString(string& str1) { 
    //code 
} 


int getString (string str1) { 
    //code 
} 

E se io intenzione di cambiare la stringa, allora c'è qualche differenza tra i due? È perché le stringhe sono immutabili in C++?

+2

Le stringhe non sono immutabili in C++. Se non è necessario modificarlo, basta passare con riferimento const. – chris

risposta

7

letterali stringa sono immutabili, std::string s non lo sono.

Il primo è il pass-by-reference. Se non si prevede di modificare la stringa, passarla con il riferimento const.

Il secondo è pass-by-value - se si modifica la stringa all'interno della funzione, si modificherà solo una copia, quindi è discutibile.

+0

quindi se passo per riferimento e cambio la stringa, la stringa originale sarà cambiata? non una copia, a differenza di java? – ofey

+0

@ofey - sì, ma l'ultima volta che ho usato Java sono abbastanza sicuro che anche i tipi di classe (cioè non fondamentali) vengono passati per riferimento, non per valore. Tuttavia, potrebbe essere una differenza tra 'stringa' e' String' in Java. – slugonamission

+0

@slugonamission quindi se voglio cambiare una stringa enorme e non mi interessa salvare il suo valore originale, dovrei passarlo per riferimento e nessuna copia locale deve essere fatta? – ofey

9

Perché non si passa per riferimento const? In questo modo non verrà effettuata nemmeno una copia, né la funzione chiamata sarà in grado di modificare la stringa.

int getString(string const &str1) 
{ 
} 
2

Sì, ci sarà una differenza.

La seconda variante (senza &) sarà copiare la stringa dal valore nel campo di applicazione della funzione getString. Ciò significa che qualsiasi aggiornamento apportato influirà sulla copia locale, non sulla copia del chiamante. Questo viene fatto chiamando il costruttore di copie della classe con il vecchio valore (std::string(std::string& val)).

D'altra parte, la prima variante (con il &) passa per riferimento, quindi la modifica della variabile locale cambierà la variabile del chiamante, a meno che il riferimento non sia contrassegnato come const (nel qual caso, non è possibile modificare il valore) . Questo dovrebbe essere più veloce poiché non è necessario eseguire alcuna operazione di copia se non si modifica la stringa.

Problemi correlati