Poznaj C++ w$ godziny0207

Poznaj C++ w$ godziny0207



198 Godzina 14

198 Godzina 14

ANALIZA:


Implementacja operatora ++, zawarta w liniach 26-30, została zmieniona tak, że zwraca aktualny obiekt za pomocą pośredniego odwołania do this. Dzięki temu możemy wykonać operację przypisania w linii 40. Jeśli obiekt klasy Licznik rezerwowałby pamięć, to trzeba by było również napisać własny konstruktor kopiujący, uwzględniający to. Jednak w tym konkretnym przypadku domyślny konstruktor kopiujący jest całkowicie wystarczający.

Zauważ, że wartość zwracana jest referencją do obiektu klasy Licznik, przez co unikamy zbędnego tworzenia kopii obiektu. Jest ona zadeklarowana jako const, ponieważ wartość nie powinna być zmieniona przez funkcje wykorzystującą ten obiekt.

Przeciążenie operatora przyrostkowego

Co zrobić, jeśli chcesz przeciążyć operator przyrostkowy? Pojawia się tutaj pewien problem. Jak rozróżnić oba operatory - przedrostkowy i przyrostkowy? Przyjęta została konwencja, że w przypadku deklaracji operatora przyrostkowego (postfix) podaje się parametr całkowity (patrz listing 14.3). Wartość tego parametru jest ignorowana, stanowi on jedynie sygnał dla kompilatora.

Różnica między operatorem przyrostkowym a przedrostkowym

Zanim zaczniemy przeciążać operatory przyrostkowe i przedrostkowe musimy poznać różnicę miedzy nimi. W skrócie: operator przedrostkowy najpierw inkrementuje zmienną, a potem zwraca jej wartość, operator przyrostkowy odwrotnie, najpierw zwraca wartość, a potem inkrementuje zmienną.

0    ile operator przyrostkowy może zwiększyć wartość i zwrócić obiekt przez wartość (tak jak w listingu 14.2), to operator przedrostkowy musi zwrócić wartość przed inkrementacją. W tym celu trzeba stworzyć pomocniczy obiekt, przechowujący początkową wartość obiektu przed inkrementacją. Zwrócić należy ten chwilowy obiekt.

Spójrzmy na to wszystko z innej strony. Jeśli napiszesz: a * x++;

1    x było równe 5, to po wykonaniu tej instrukcji a będzie równe 5 i x będzie równe 6. Dzieje się tak dlatego, że zwracamy wartość x i przypisujemy ją do a. Jeśli x jest obiektem, to jego operator przyrostkowy musi przechować oryginalną wartość x w obiekcie pomocniczym, zwiększyć x i zwrócić obiekt pomocniczy.

Pamiętaj jednak, że zwracając obiekt pomocniczy nie można go zwrócić przez referencję gdyż jest to obiekt lokalny. Koniecznie trzeba go zwrócić przez wartość.

Listing 14.3 demonstruje sposób przeciążania i wykorzystania operatora przyrostkowego i przedrostkowego.

Implementacja operatora ++, zawarta w liniach 26-30, została zmieniona tak, że zwraca aktualny obiekt za pomocą pośredniego odwołania do this. Dzięki temu możemy wykonać operację przypisania w linii -10. Jeśli obiekt klasy Licznik rezerwowałby pamięć, to trzeba by było również napisać własny konstruktor kopiujący, uwzględniający to. Jednak w tym konkretnym przypadku domyślny konstruktor kopiujący jest całkowicie wystarczający.

ANALIZA


Zauważ, że wartość zwracana jest referencją do obiektu klasy Licznik, przez co unikamy zbędnego tworzenia kopii obiektu. Jest ona zadeklarowana jako const, ponieważ wartość nie powinna być zmieniona przez funkcje wykorzystującą ten obiekt.

Przeciążenie operatora przyrostkowego

Co zrobić, jeśli chcesz przeciążyć operator przyrostkowy? Pojawia się tutaj pewien problem. Jak rozróżnić oba operatory - przedrostkowy i przyrostkowy? Przyjęta została konwencja, że w przypadku deklaracji operatora przyrostkowego (postfix) podaje się parametr całkowity (patrz listing 14.3). Wartość tego parametru jest ignorowana, stanowi on jedynie sygnał dla kompilatora.

Różnica między operatorem przyrostkowym a przedrostkowym

Zanim zaczniemy przeciążać operatory przyrostkowe i przedrostkowe musimy poznać różnicę miedzy nimi, W skrócie: operator przedrostkowy najpierw inkrementuje zmienną, a potem zwraca jej wartość, operator przyrostkowy odwrotnie, najpierw zwraca wartość, a potem inkrementuje zmienną.

0    ile operator przyrostkowy może zwiększyć wartość i zwrócić obiekt przez wartość (tak jak w listingu 14.2), to operator przedrostkowy musi zwrócić wartość przed inkrementacją. W tym celu trzeba stworzyć pomocniczy obiekt, przechowujący początkową wartość obiektu przed inkrementacją. Zwrócić należy ten chwilowy obiekt. Spójrzmy na to wszystko z innej strony. Jeśli napiszesz:

a = x++;

1    x było równe 5, to po wykonaniu tej instrukcji a będzie równe 5 i x będzie równe 6. Dzieje się tak dlatego, że zwracamy wartość x i przypisujemy ją do a. Jeśli x jest obiektem, to jego operator przyrostkowy musi przechować oryginalną wartość w obiekcie pomocniczym, zwiększyć x i zwrócić obiekt pomocniczy.

Pamiętaj jednak, że zwracając obiekt pomocniczy nie można go zwrócić przez referencję gdyż jest to obiekt lokalny. Koniecznie trzeba go zwrócić przez wartość. Listing 14.3 demonstruje sposób przeciążania i wykorzystania operatora przyrostkowego i przedrostkowego.


Wyszukiwarka

Podobne podstrony:
Poznaj C++ w$ godziny0030 14 Godzina 1 P: Czy można ignorować ostrzeżenia kompilatora (wamings) O: W
Poznaj C++ w$ godziny0063 48 Godzina 4 12:    cout « "


Poznaj C++ w$ godziny0082 68Godzina 5 14:    cout « "Podaj liczbę od 0 do 10,000
Poznaj C++ w$ godziny0084 70 Godzina 5 70 Godzina 5 8: 9: 10 11 12 13 14 15 16 17 18 19 20
Poznaj C++ w$ godziny0100 86 Godzina 6 86 Godzina 6 11 12 13 14 15 16 17 18 19 20
Poznaj C++ w$ godziny0140 Wskaźniki 129 Wskaźniki 129 13 14 15 16 17 18 cout « "longVar: "
Poznaj C++ w$ godziny0191 IfZaawansowane narzędziaGodzina 13    Zaawansowane funkcje
Poznaj C++ w$ godziny0205 196Godzina 14 Listing 14.1. Klasa Licznik 1:    // Listing
Poznaj C++ w$ godziny0206 197Przeciążanie operatorów Listing 14.2. Przeciążenie operatora
Poznaj C++ w$ godziny0208 Przeciążanie operatorów 199Listing 14.3. Operator przedrostkowy i
Poznaj C++ w$ godziny0211 202 Godzina 14Listing 14.5. Operator
Poznaj C++ w$ godziny0213 204 Godzina 14 przez wskaźniki zawarte w obiekcie oryginalnym. Widać to by
Poznaj C++ w$ godziny0215 206Godzina 14 W liniach 34-37 kasowane i odtwarzane są wewnętrzne zmienne
Poznaj C++ w$ godziny0217 208 Godzina 14 licz: 5 ANALIZA: W linii 11 zaszła ważna zmiana. Przeciążyl
Poznaj C++ w$ godziny0231 222 Godzina 15 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Poznaj C++ w$ godziny0001 Gdy masz czas tylko na właściwe rozwiązania... Intersoftlcind Gdy masz cza
Poznaj C++ w$ godziny0002 Jesse LibertyC++w 2 4 godziny Tłumaczenie: Grzegorz MichałekInlersofllond
Poznaj C++ w$ godziny0003 Tytuł oryginału: Teach Yourself C++ in 24 Hours, Second Edition Tłumaczeni
Poznaj C++ w$ godziny0004 Spis rozdziałów Część 1 Wstęp do C++ 1 1 Zaczynamy 3 2 Program w C++ 1

więcej podobnych podstron