Witam. Mam problem ze zrozumieniem zwracania referencji przez funkcje. Problem był już kiedyś poruszany na forum, jednak nadal nie mogę tego zrozumieć. xd
Mamy taki prosty program, w którym przez referencje chcemy przekazać do funkcji liczbę i zwrócić kwadrat tej liczby.
#include <iostream>
#include <string>
using namespace std;
int & wynik(int & a);
int main()
{
int liczba = 4;
int & rf = liczba;
cout<<"Liczba = "<<liczba<<endl;
cout<<"Wyslanie liczby przez referencje do funkcji i zwrocenie przez referencje jej kwadratu.\n"<<endl;
rf = wynik(rf);
cout<<"Teraz zmienna liczba = "<<liczba<<endl;
return 0;
}
int & wynik(int & a)
{
int w=0;
w = a*a;
return w; //nie zadziala
}
Tutaj póki co chyba wszystko rozumiem. Program nie działa, bo funkcja ma zwrócić referencje, ale przez return zwracamy zmienną lokalną w, która przestaje istnieć w momencie zakończenie funkcji, więc program się wiesza, bo po powrocie do funkcji main próbuje się odwołać do obszaru pamięci, którego już nie ma. Dobrze myślę? Poprawna wersja tej funkcji to:
int & wynik(int & a)
{
a *= a;
return a;
}
Tutaj wszystko zadziała, a wynik to będzie 16. Tylko nie wiem co się dzieje z tą zmienną a, w momencie zakończenia działania funkcji wynik i powrotu do main. Przecież po zakończeniu działania funkcji wynik wszystkie zmienne w niej są "niszczone", to dlaczego w przypadku przypisania wyniku do zmiennej lokalnej i zwróceniu jej, program przerywa działanie, ale w przypadku zwrócenia referencji z parametru funkcji już wszystko działa normalnie? Gdzieś czytałem, że w przypadku zwracania referencji program tworzy jakąś zmienną tymczasową/anonimową, do której przypisywana jest ta wartość, a następnie jest ona przypisywana do zmiennej rf w main? Czy chodzi o to, że druga wersja funkcji zadziałała, bo zwróciliśmy referencje która jest parametrem w funkcji?
Może opisałem mój problem trochę chaotycznie, ale czy może mi ktoś wytłumaczyć, na jakiej zasadzie działa to zwracanie referencji przez funkcje?