Files
PPC/Reference.md

1.6 KiB

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.