51 lines
1.6 KiB
Markdown
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.
|
|
|
|
```cpp
|
|
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
|
|
```cpp
|
|
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ů.**
|
|
```cpp
|
|
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.** |