Gdyby funkcja była taka:
void funkcja(int x);
to oznaczałoby, że zmienna podana jako argument zostanie skopiowana. Gdy robisz funkcję z referencją wtedy funkcja nie tworzy kopii zmiennej a działa na tej samej zmiennej i może zmieniać jej wartość. Np.
void funkcja(int &x){
x ++;
}
int main(){
int x = 0;
cout << x << endl;
funkcja(x);
cout << x << endl;
return 0;
}
to wynik kodu będzie mniej więcej taki:
0
1
Co oznacza, że zmienna została w funkcji zmodyfikowana. Przez wskaźnik działało by to podobnie:
void funkcja(int *x){
*x ++;
}
int main()
int x = 0;
cout << x << endl;
funkcja(&zmienna);
cout << x << endl;
}
Efekt ten sam co w funkcji z referencją, ale tutaj musisz przekazać wskaźnik na zmienną typu int. W rezultacie tworzona jest kopia wskaźnika typu int.
Przekazywanie argumentów przez referencje często stosuje się przy przekazywaniu dużych obiektów klas, których kopiowanie byłoby czasochłonne. Można też celowo określić, że chociaż obiekt jest przekazywany przez referencje to nie chcesz aby uległ on modyfikacji w takim przypadku stosuje się słowo kluczowe const:
void funkcja(const int &x){
}
powyższa funkcja nie może modyfikować zmiennej x.