Hai ragione :POriginariamente inviato da RooccoXXI
No, è il contrario di quello che hai appena scritto. L'operatore & serve a passare la variabile per riferimento (modifiche permanenti!), mentre se lo lasci via la variabile viene passata per valore (quindi copiata prima di essere passata alla funzione e le modifiche rimangono solo all'interno della funzione).
Ora è chiaro, è una questione di ottimizzazione.Originariamente inviato da RooccoXXI
La storia del const è legata all'efficienza e alla sicurezza.
Passando una variabile per valore hai il vantaggio che il valore originale della variabile non viene modificato, però questo richiede una copia; nel caso di tipi fondamentali questa copia è veloce, ma nel caso di oggetti di grosse dimensioni può compromettere seriamente l'efficienza del programma.
Passando per valore hai il vantaggio che la variabile non viene copiata (quindi niente tempo di copia!) ma però potrebbe essere modificata accidentalmente.
L'utilizzo di const con la chiamata per riferimento mette assieme i due vantaggi, eliminando gli svantaggi: la variabile non viene copiata (quindi efficenza!) ma la parola chiave const non ti permette di fare modifiche alla variabile (così da non modificare accidentalmente il valore originale). Questo sempre se NON devi/vuoi modificare il valore della variabile. Se ti serve che la funzione cambi il valore della variabile allora questa va passata per riferimento normale (solo con l'operatore &, senza const).
Questo perché, usando #define (ad esempio così: #define N 5) il precompilatore non fa altro che trovare tutte le occorrenze di N e sostituirle col valore 5, giusto? In pratica una const può essere "manipolata" un #define no.Originariamente inviato da MItaly
Il #define è una sostituzione di testo "forza bruta" attuata dal precompilatore; le "variabili" const invece sono direttive del linguaggio comprese dal compilatore ed integrate nel linguaggio, il che significa ad esempio che le costanti hanno uno scope, possono essere inizializzate in base a parametri di template, e così via.
P.S. Ho fatto un programmino per provare un po di cose (tra cui sopratutto questa cosa del passaggio di argomenti a funzioni), va bene com'è o sbaglio qualcosa? (viene compilato senza né errori né warnings, e eseguito senza problemi)
http://pastebin.com/hbWLKG7R