Konstruktor kopiujący - krótkie pytanie

0

Witam, banalny przykład, mam klasę:

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:

 
A a_obiekt = 10;

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

A a_obiekt = 10; //BŁĄD

Dlaczego tak jest? Co się dzieje w programie?

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.

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);

0

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

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

// i później:

A a_obiekt = 10;
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

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