Files
PPC/Reference.md

51 lines
1.6 KiB
Markdown

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.**