Prerequisiti
- Conoscere il concetto di funzione
- Conoscere il concetto di riferimento in c++
Quando definiamo i parametri di una funzione dobbiamo sempre aver chiaro che si possono fare due tipi di passaggio.
Nel passaggio per valore il valore del parametro utilizzato nella funzione, detto anche parametro attuale, conterrà si lo stesso valore del parametro attuale, ovvero della variabile passata come parametro. Trattandosi di una copia i valori dei parametri attuale e formale tuttavia saranno salvati a due indirizzi diversi della RAM, rendendo una modifica al parametro formale invisibile una volta usciti dalla funzione. Questo accade in quanto il parametro formale viene allocato nello stack della funzione (che è una zona di memoria locale e che viene deallocata all’uscita dalla funzione stessa).
Nel passaggio per riferimento Il valore del parametro formale e di quello attuale oltre a condividere i valori, condividono anche lo stesso indirizzo di memoria. In questo modo una modifica nella funzione al parametro formale porterà ad una modifica anche del parametro attuale.
Esempi di passaggio per valore
#include <iostream>
void f(int a) {
a = a+2;
}
int main() {
int valore = 42;
f(valore);
std::cout << valore;
return 0;
}
Cosa succede in questo codice? il parametro passato a f
è passato per valore e quindi ne viene fatta una copia nel parametro formale. Questo vuol dire che valore
e a
avranno lo stesso valore quando si entra nella funzione f
. Essendo salvate in indirizzi diversi della memoria, all’uscita della funzione, a
varrà sempre 42 visto che nessuna scrittura è stata fatta al suo indirizzo.
Esempio di passaggio per riferimento
#include <iostream>
void f(int &a) {
a = a+2;
}
int main() {
int valore = 42;
f(valore);
std::cout << valore;
return 0;
}
In questo caso invece viene fatto un passaggio di parametro per valore, quindi il parametro formale e attuale condividono valore ma soprattutto l’indirizzo. Quindi ogni modifica nel parametro formale si riflette nel parametro attuale. Questo porta valore
a 44
dopo la chiamata a f
.
Quali tipi di dati vengono passati per riferimento?
In modo automatico vengono passati per riferimenti solo gli array c-style. Tutto il resto (float, int, chat, double, std::string, std::vector, std::array) vengono invece passati per valore
Quando fare il passaggio per riferimento?
- Quando voglio ritornare più di un valore da una funzione
- Quando devo passare degli oggetti (std::string, std::vector…) tali per cui una copia sarebbe troppo onerosa. Nel caso la variabile passata per riferimento non venga modificata dalla funzione utilizzerò la dichiarazione const per indicare che non verrà modificata.