Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Przeciążanie operatorów na przykładzie operator +=

Ostatnio zmodyfikowano 2012-09-09 13:31
Autor Wiadomość
Elaine
» 2012-09-07 23:51:30
C/C++
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ć
C/C++
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.
P-64561
DejaVu
» 2012-09-08 00:19:45
@up: No fakt, GCC mówi 'idź na drzewo' :) ale Visual C++ kompiluje to :)
C/C++
class CKlasa
{
public:
    CKlasa kopia() { return * this; }
    void metoda() { }
};

int main()
{
    CKlasa x;
    CKlasa & y = x.kopia();
    y.metoda();
    return 0;
}
P-64563
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
C/C++
this->calkowita = -( this->calkowita ); //TUTAJ
return * this;
Już się zmienia wartość składowej klasy po lewej stronie ? Czy dopiero po zwróceniu wartości ?
P-64658
Mrovqa
» 2012-09-09 13:31:34
@up najpierw jest wszystko pobierane i wyliczane, dopiero potem przypisywane.
P-64690
1 2 « 3 »
Poprzednia strona Strona 3 z 3