Referencja to spory dział :D Generalnie jest to ulepszony i bezpieczny mechanizm wskaźników z C. Przekazywanie przez referencje głównie pozwala na zaoszczędzenie czasu i pamięci. Jest kilka rodzajów przekazywania przez referencje :
void func(int& x);
Ten sposób przekazuje orginalny obiekt do funkcji, przy czym ten obiekt musi istnieć, tzn nie możemy zrobić tak func(5);
void func(const int& x);
Również przekazujemy orginalny obiekt, przy czym nie może być on modyfikowany wewnątrz funkcji. Dodatkowo możemy przesłać tymczasową zmienną, czyli np. func(5);
void func(int&& x);
Tak zwana referencja do r-wartości, pozwala na przekazanie obiektu tymczasowego (takiego bez nazwy :D), do funkcji bez niepotrzebnego kopiowania go :D W takim wypadku do funkcji możemy przekazać tylko i wyłącznie tymczasowe obiekty :) func(y); nie zadziała :P ale do tego polecam poczytać o semantyce przenoszenia C++11 :P
void func(const int&& x);
Podobnie jak wyżej, z tą różnicą że nie możemy modyfikować podawanej wartości, bez const jest to możliwe :)