Attualmente sto imparando C ++ dalla 5 ° edizione di C ++ Primer. Il capitolo sulle funzioni del libro afferma che solo gli oggetti di grandi dimensioni (quelli grandi relativi come le stringhe delle librerie standard contano, ma i "tipi primitivi" come int o char non lo fanno) dovrebbero essere passati come riferimenti.
Ad esempio, la funzione seguente serve come esempio nel libro su quando utilizzare i parametri di riferimento:
string::size_type find_char(const string &s, char c, string::size_type &occurs){
/* code to return the first occurrence of c in s, occurs contains total number of occurrences */
}
Uno degli esercizi chiede quale sia la ragione per cui ciascun parametro è ciò che è al di là del suo tipo di base. Capisco perché la stringa è un riferimento (per impedire la copia di migliorare le prestazioni) e perché è const (in quanto non ha bisogno di essere modificato). Capisco anche perché il parametro occurs
sia un riferimento (poiché il valore della variabile originale deve essere modificato).
Ciò che non capisco è perché c
non sia un riferimento (const). So che contiene un oggetto molto piccolo, ma, non impedirebbe la copia di qualsiasi oggetto, indipendentemente da quanto piccolo, sia ancora un miglioramento delle prestazioni?
Se ci fosse qualche svantaggio nell'usare i riferimenti, allora avrebbe senso. Ma, non ho idea di cosa sarebbe un tale svantaggio. Inoltre, so che l'indirizzo di un puntatore verrebbe copiato, ma, poiché i riferimenti non possono essere modificati, immagino che la funzione chiamata possa accedere alla variabile originale esattamente nello stesso modo in cui lo fa il chiamante (assumendo che la variabile sia dichiarata nel chiamante).
Perché dovrebbe mai essere usato un parametro non di riferimento, specialmente in istanze come l'esempio precedente, a meno che il parametro non debba essere modificato per l'implementazione della funzione senza restituire il valore modificato?
NOTA: il corpo della funzione è incluso nel libro, ma, per brevità, viene rimosso da questa domanda.