funkcja zwracająca referencję

0

Teoretycznie poniższy fragment kodu nie ma sensu, bo zwracamy referencję do obiektu, który jest założony na stosie i przestaje istnieć:

 
#include <iostream>

using namespace std;

int& funRef()
{
	int k = 1;
	int &ref = k;
	return ref;
}

void main()
{
	cout<<endl;
        int &ref = funRef();
	cout<<ref;
	cout<<endl;

	system("pause");
}

Jednak program w vs 2010 uruchamia się i wyświetla wynik: 1. Proszę o wytłumaczenie. Zastanawiam się też czy w przypadku powyższej funkcji zapis:

int k = 1;
int &ref = k;
return ref;

jest równoważny poniższemu:

 
return k;
0
int &ref = k;

Nigdy nie spotkałem się z & przy deklaracji zmiennej. Dziwi mnie jak to działa. Wydaje mi się, ze dziwne rzeczy mogą się dziać ;d. Aby zwrócić obiekt przez referencję wystarczy jedynie, tak jak napisałeś,

int& dupa()
{int k = 3; return k;}

Co do równoważności nie jestem pewien. W 'zwykłym użyciu' &ref spowodowało by wyłuskanie adresu w którym znajduje się zmienna ref. Jednak w tym przypadku nie miałoby to sensu. Może ktoś kto już to widział się wypowie.

4

To, że wyświetla poprawny wynik to taki fart. To, że zmienna przestaje istnieć, nie znaczy, że pamięć po niej jest jakoś zamazywana. Ta 1 tam będzie tak długo, aż coś jej nie nadpisze(pewnie wywołanie kolejnej funkcji).

@Sopelek: google: c++ referencja

0

Ok, a co z równoważnością zapisu ?

0

Można powiedzieć, że są równoważne - tzn. wynik działania jest taki sam.

0

Przy okazji takich WTF w C++ przypomniał mi się temat http://4programmers.net/Forum/C_i_C++/190928-definicja_metody?p=804117#id804117, gdzie napisałem na prawdę niezłe WTF(tyle, że celowo:))
Różni się tym, że zwracając wartość, nikt nie złapie się za głowę, albo w niektórych przypadkach nie wywalisz programu. Referencja jest tak jakby wskaźnikiem, tyle, że nie jest tak elastyczna..

1 użytkowników online, w tym zalogowanych: 0, gości: 1