Reference je v podstatě jako **konstantní ukazatel** s jistými omezeními: - musí být inicializována při vytvoření - nemůže být null - nedá se měnit, kam ukazuje (stejně jako konst. uk.) a neumí aritmetiku **Používá se jako normální proměnná se jménem (bez \*)** Zásadní mentální rozdíl taky můžeme hledat v tom, co to vlastně je. Ukazatel je proměnná s adresou v paměti, zatímco reference je alias pro objekt/proměnnou. ``` int x = 5; # nějaká proměnná x int& r = x; #inicializace reference, musí mít hodnotu. #int& r; #není možné int* p; # ukazatel to umí - pro srovnání p = &x; ``` Referenci nelze přesměrovat na jinou adresu/proměnnou ``` int a = 1; int b = 2; int* p = &a; #ukazatel ukazuje na a p = &b; # ukazatel ukazuje na b int& r = a; #reference ukazuje na a r = b; #reference nabírá hodnoty b, teď a = b # a = b; je ekvivalentní ``` - Reference nemá vlastní adresu, není to proměnná a nebo objekt. Pokud se pokusím získat adresu reference, dostanu adresu objektu, na který ukazuje. K čemu to je dobré? - stále můžu používat referenci na předání funkci. **To je hlavní důvod existence referencí - bezpečnější a čitelnější předávání parametrů místo ukazatelů.** ``` void increment(int& r) { r++; #melo by zvysit jakoukoli promennou, co je predana jako parametr } int main() { int x = 42; increment(x); #zde predam proste puvodni promennou } ``` - **Je to omezenější než ukazatel a proto je tu menší šance, že se uživatel střelí do nohy. Když to stačí, mělo by se to používat místo ukazatele. Doporučuje se to.**