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

Przeciążanie operatora+, a konstruktor kopii.

Ostatnio zmodyfikowano 2013-07-23 21:23
Autor Wiadomość
Prakosza
Temat założony przez niniejszego użytkownika
Przeciążanie operatora+, a konstruktor kopii.
» 2013-07-23 20:57:18
Uczę się programować i ostatnio napisałem prosty program, w którym ćwiczyłem przeciążanie operatorów.
Jak się okazało nie mogę zastosować takiej konstrukcji:
C/C++
licznik licznik::operator +( licznik & rhs )
{
    return licznik( licz + rhs.getLicz() );
}
o ile nie zastosuje takiej konstrukcji konstruktora kopii
licznik( const licznik & );
i za chiny nie mogę dojść, dlaczego gdy usunę z niej const, program się nie kompiluje, pomimo tego, iż konstruktor ten w ogóle w programie nie jest używany.
P-88640
pekfos
» 2013-07-23 21:01:32
Jakby nie był używany, to by nie było problemu. const tam musi stać, by można było podać obiekt tymczasowy (np wynik operatora +).
P-88641
Prakosza
Temat założony przez niniejszego użytkownika
» 2013-07-23 21:06:47
Tak napisałem konstruktor kopii, by za każdym razem, gdy jest używany wyświetlał o tym komunikat. Podczas działania programu tego komunikatu nie ma, więc myślałem, że nie jest on wykorzystywany.
P-88642
pekfos
» 2013-07-23 21:12:40
Równie dobrze możesz nie wywoływać nigdzie kodu używającego konstruktora kopiującego, ale ten kod również jest kompilowany i musi być poprawny.
P-88644
Monika90
» 2013-07-23 21:23:43
Ponieważ zwracasz obiekt przez wartość, to klasa musi mieć konstruktor kopiujący (lub przenoszący), nawet wtedy gdy jego wywołanie zostanie pominięte (w ramach optymalizacji, co ma miejsce w twoim przypadku).

Jak zadeklarujesz swój własny konstruktor z parametrem licznik&, to kompilator spróbuje go użyć, a ponieważ zwracasz obiekt tymaczasowy, czyli r-wartość, to ta próba zakończy się niepowodzeniem, bo referencje do nie-const nie wiążą się z r-wartościami.

Zmień nazwę tematu, bo nie ma czegoś takiego jak "obciążanie operatora"
P-88645
Prakosza
Temat założony przez niniejszego użytkownika
» 2013-07-23 21:23:56
Przepraszam, oczywiście chodzi o przeciążanie.
Dziękuje za wyjaśnienie.
P-88647
« 1 »
  Strona 1 z 1