Zwracanie statica w funkcji

Zwracanie statica w funkcji
WY
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 10 lat
  • Postów:6
0

Generalnie chodzi o to, że nie do końca rozumiem, dlaczego przy zwracaniu statica przez wartość tworzy się gdzieś kopia. Tak jak w poniższym przykładzie:

Kopiuj
include <iostream>
using namespace std;

class Test
{
	public:
	Test(){cout << "Oryginal." << endl;}
	Test(const Test& copy)
	{
		cout << "Kopia." << endl;
	}
};

Test foo()
{
	static Test test;
	return test;
}

int main()
{
	foo();
	return 0;
} 

W outpucie wychodzi:
Oryginal.
Kopia.

Pytanie dlaczego jest wywolywany konstruktor kopiujacy? Oczywiscie bez statica tego zjawiska nie ma.

spartanPAGE
  • Rejestracja:prawie 12 lat
  • Ostatnio:około miesiąc
4

Funkcja musi zwrócić kopie obiektu - ze względu na static compiler magic nie dochodzi do skutku

WY
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 10 lat
  • Postów:6
0

Wow, szybka odpowiedz, dzieki:)

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:Szczecin
1

Wywołaj foo dwa razy, ze staticem i bez, to zobaczysz dlaczego :)


WY
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 10 lat
  • Postów:6
0

kurde, ale czegos dalej nie rozumiem:

Kopiuj
#include <iostream>
using namespace std;

class Test
{
//
};

Test foo()
{
	Test test;
	cout << &test << endl;
	return test;
}

int main() {

	Test t = foo();
	cout << &t << endl;
	return 0;
} 

Dlaczego tutaj oba adresy sa te same? Przeciez nie zwracamy przez referencje, tylko przez wartosc. Jesli te same operacje robie w funkcji zwracajacej np inta, to adresy sa inne. Zwariowalem:) Pytalem programisty, ale tez nie wiedzial.

twonek
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
5

Obstawiam, że nastąpił copy elision. Kompilator widząc, że obiekt w funkcji został stworzony tylko po to, żeby być przypisanym do tego main, od razu utworzył go tam gdzie ten w main ma być.

fasadin
napisalem tam blednie to usunalem posta ;)
WY
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 10 lat
  • Postów:6
0

o, ciekawa sprawa:) dzieki wielkie jeszcze raz!

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.