Zwracanie statica w funkcji

Zwracanie statica w funkcji
WY
  • Rejestracja: dni
  • Ostatnio: dni
  • 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: dni
  • Ostatnio: dni
4

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

WY
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6
0

Wow, szybka odpowiedz, dzieki:)

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
1

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

WY
  • Rejestracja: dni
  • Ostatnio: dni
  • 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: dni
  • Ostatnio: dni
  • 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ć.

WY
  • Rejestracja: dni
  • Ostatnio: dni
  • 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.