Przeciążanie operatorów na przykładzie operator +=
Ostatnio zmodyfikowano 2012-09-09 13:31
Elaine |
» 2012-09-07 23:51:30 CKlasa x; CKlasa & y = x.kopia(); y.metoda();
W powyższym przypadku wywołanie metody z obiektu 'y' oznacza zgon aplikacji. |
Jeśli CKlasa::kopia zwraca wartość, to ten kod się nawet nie skompiluje*.
Można natomiast zrobić
Foo obj; const Foo & a = Foo( obj ); Foo && b = Foo( obj ); a.readState(); b.readState(); b.changeState();
Jeśli te referencje są zmiennymi lokalnymi w funkcji, to obiekty pod referencjami zostaną zniszczone nie "na średniku", jak ma to miejsce zwykle, tylko w momencie wyjścia z zasięgu definiującego te referencje.
* Kompilator Microsoftu ma bardzo nielubiane rozszerzenie, dzięki któremu potrafi to skompilować, ale nikt tego nie używa; żeby zaczął gadać, kiedy to rozszerzenie jest użyte, trzeba podkręcić ostrzeżenia na co najmniej poziom czwarty. |
|
DejaVu |
» 2012-09-08 00:19:45 @up: No fakt, GCC mówi 'idź na drzewo' :) ale Visual C++ kompiluje to :) class CKlasa { public: CKlasa kopia() { return * this; } void metoda() { } };
int main() { CKlasa x; CKlasa & y = x.kopia(); y.metoda(); return 0; }
|
|
diego997 Temat założony przez niniejszego użytkownika |
» 2012-09-08 23:51:41 @Cyklopek cudownie to wytłumaczyłeś, doszedłem też do wniosku że jeżeli nie zwraca się przez referencję to odpala się nam niejawny konstruktor kopiujący i jeżeli w środku były jakieś składowe wskaźnikowe to zmieniają adres EDIT:: Jeszcze malutkie pytanie w tym momencie gdzie zaznaczyłem this->calkowita = -( this->calkowita ); return * this;
Już się zmienia wartość składowej klasy po lewej stronie ? Czy dopiero po zwróceniu wartości ? |
|
Mrovqa |
» 2012-09-09 13:31:34 @up najpierw jest wszystko pobierane i wyliczane, dopiero potem przypisywane. |
|
1 2 « 3 » |