Cześć,
mam ogromną prośbę: czy mógłby mi ktoś podać jakiś sensowny przykład funkcji, która zwracałaby referencję oraz napisać czym różni się zwracanie referencji od wskaźnika w C++?
Tak jak jestem znaleźć sens zwracania wskaźników tak z referencjami jakoś mi nie idzie...
Z góry dziękuję za pomoc w wyjaśnieniu tych kwestii!
Przykład z życia wzięty: operator<< oraz operator>> zwracają referencje do ostream / istream żebyś mógł kaskadowo robić
cout << 1 << 2 <<3;
Gdyby operator<< nie zwracał tej referencji to nie mógł być tak zrobić.
Dzięki Shalom, ale bardziej mi chodziło o tradycyjną funkcję typu:
double& funkcja(...)
{
...
return(referencja)
}
Czy dla takich tradycyjnych funkcji jest jakieś praktyczne zastosowanie? Przeładowanie operatora to dość specyficzny przykład.
No jeśli jako argument dostałeś do funkcji referencje do jakiegoś obiektu to możesz też ten obiekt zwrócić przez referencje żeby uniknąć jego kopiowania.
W praktyce to się może przydać raczej jak masz obiekt jakiejs klasy i chcesz zwrócic referencje do oryginalnego pola tego obiektu.
Shalom napisał(a):
No jeśli jako argument dostałeś do funkcji referencje do jakiegoś obiektu to możesz też ten obiekt zwrócić przez referencje żeby uniknąć jego kopiowania.
W praktyce to się może przydać raczej jak masz obiekt jakiejs klasy i chcesz zwrócic referencje do oryginalnego pola tego obiektu.
Czyli dobrze rozumiem, że taka funkcja:
double& kwadrat(double& x) //przyjmuje referencję
{
x = x*x;
return (x); zwraca referencję
}
wykona się szybciej, niż:
double kwadrat(double& x) //przyjmuje referencję
{
x = x*x;
return(x); //zwraca zwykłą zmienną?
}
?
Wydawało mi się, że kopia powstaje w momencie przekazywania zmiennych jako argument do funkcji, a nie w miejscu, gdzie funkcja zwraca wynik...
Kopia powstaje w obu przypadkach (argument, zwracanie). Drugi przypadek zwraca raczej wartość, nie zmienną.
Powiem szczerze, że trochę tego nie rozumiem :(
No ale nic, dziękuję za dobre chęci! ;-)
Zawsze jeśli zwracasz coś z funkcji lub przekazujesz jako argument nie przez referencje i nie przez wskaźnik to następuje kopiowanie. Zawsze.