Konstruktor kopiujący - krótkie pytanie

Konstruktor kopiujący - krótkie pytanie
DE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0

Witam, banalny przykład, mam klasę:

Kopiuj
class A
{
	public:
		A(){}
		A(/*const*/ A& a){}
		A(int i){}	
};

Gdy usunę komentarz /*const */ z listy parametrów konstruktora kopiującego mogę w programie napisać w następujący sposób:

Kopiuj
 
A a_obiekt = 10;

Gdy komentarz zostanie jak w oryginale, czyli gdy parametr konstruktora kopiującego nie będzie stały wówczas:

Kopiuj
A a_obiekt = 10; //BŁĄD

Dlaczego tak jest? Co się dzieje w programie?

Endrju
  • Rejestracja: dni
  • Ostatnio: dni
1

Gdy robisz tak: A a_obiekt = 10; za pomocą konstruktora A::A(int) zostaje utworzony tymczasowy obiekt klasy A. Ze względu na to, że jest tymczasowy nie możesz go zmieniać, (to takie uproszczenie, musisz poczytać o r-values) więc konstruktor kopiujący musi przyjąć stałą referencję.

Aby to zrozumieć dokładniej możesz poczytać tutaj o tym, co to l-values i r-values: http://eli.thegreenplace.net/2011/12/15/understanding-lvalues-and-rvalues-in-c-and-c/ Sprawę dodatkowo komplikują r-value references z C++11.

AN
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 36
0

To co mówisz jest trochę dziwnie tu powinien zadziałać trzeci konstruktor, jaki masz kompilator?
Z drugiej strony konstruktor kopiujący raczej powinien mieć stałą referencje.
No i zawsze możesz użyć:
A a_obiekt(10);

DE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0

Czy konstruktor kopiujący jest tu w ogóle wykorzystywany? Bo np:

Kopiuj
class A
{
	public:
		A(){}
		A(const A& a){cout<<"to sie nie wyswietla";}
		A(int i){}	
};

// i później:

A a_obiekt = 10;
Endrju
  • Rejestracja: dni
  • Ostatnio: dni
0

To teraz w dodatku do tego, co to r-values musisz poczytać co to jest copy elision. Zacznij tutaj: http://en.wikipedia.org/wiki/Copy_elision

Moją wersję wydarzeń zawarłem w komentarzu wyżej: http://4programmers.net/Forum/C_i_C++/211670-konstruktor_kopiujacy_-_krotkie_pytanie?p=923158#comment-108363

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.