Przeciążenie operatorów



Pobieranie 127,7 Kb.
Strona1/4
Data12.01.2018
Rozmiar127,7 Kb.
  1   2   3   4

    1. Przeciążenie operatorów.

Przeciążanie operatorów stwarza możliwość zastosowania istniejących operatorów języka C++ do operandów, których typy są niezgodne z definicją operatora standardowego. W takiej sytuacji kompilator wskazuje błąd. Jednak właściwe zdefiniowanie takiego operatora pozwala zastosować go do innych typów danych – np. obiektów. Mamy zatem do czynienia z sytuacją, w której ten sam operator posiada różne implementacje w programie. Jedną wbudowaną do struktury języka, drugą zaś zdefiniowaną przez programistę. Można zatem mówić o jego przeciążeniu.


3.5.1. Przeciążanie operatorów inkrementacji i dekrementacji
Utworzymy klasę, której składową będzie zmienna wewnętrzna typu unsigned short int. Klasa będzie opisywała grupę osób, zaś zmienna wewnętrzna liczbę osób w grupie. Bazując na wiedzy zdobytej dotychczas możemy w definicji klasy umieścić metody umożliwiające dostęp do zmiennej – liczba_osób, jak również metodę inkrementującą tą zmienną w przypadku przyjęcia nowej osoby do grupy (obraz 3.21.).
Obraz 3.21. Zastosowanie funkcji inkrementującej zmienną wewnętrzną.


Powyższy przykład pokazuje działanie funkcji, Dodaj_osobe(), inkrementującej zmienną wewnętrzną obiektu klasy. Operator inkrementacji ++ zastosowano wewnątrz definicji metody klasy do inkrementacji zmiennej wewnętrznej, typu integer, liczba_osob. Próba zastosowania tego operatora do obiektu klasy grupa kończy się oczywiście błędem kompilacji. Jednak zgodnie z zasadą przeciążania operatorów, można tak określić definicje przeciążającą ten operator, aby z powodzeniem można było go stosować również bezpośrednio do obiektów klasy w celu inkrementacji ich zmiennej wewnętrznej.
W przykładzie (obraz 3.22.) zastąpimy metodę Dodaj_osobe() przez definicje przedrostkowego operatora inkrementacji ++ .
Obraz 3.22. Definicja przedrostkowego operatora inkrementacji.


Definicja metody przeciążającej operator zwiera słowo kluczowe języka programowania – operator – oraz następujący po nim symbol przeciążanego operatora. Metoda ta zwraca aktualny obiekt (po inkrementacji zmiennej wewnętrznej liczba_osob) za pomocą pośredniego odwołania do wskaźnika this (return *this). Wartość zwracana jest przez referencje do obiektu klasy licznik. Unikamy w ten sposób tworzenia kopii obiektu.
Modyfikując nieznacznie funkcje main(), poprzez wprowadzenie dodatkowego obiektu o nazwie test (obraz 3.23.):
grupa test(20);
oraz podstawiając : test = ++g1;

otrzymujemy wynik na konsoli potwierdzający, iż nasz przeciążony operator inkrementacji jest operatorem przedrostkowym (obraz 3.23.).


Obraz 3.23. Działanie przeciążonego, przedrostkowego operatora inkrementacji.

Definicja operatora przyrostkowego wymaga zarówno innej postaci ciała definicji funkcji, jak również innej identyfikacji operatora w linii jego deklaracji, w sytuacji gdy w programie definiujemy go wraz z operatorem przedrostkowym. Występowanie obu przeciążonych operatorów : przedrostkowego i przyrostkowego wymaga w czasie deklaracji innej formy dla obu operatorów. Ponieważ symbol definiujący oba operatory (++) jest identyczny, przyjęto zatem, iż operator przyrostkowy będzie zdefiniowany z jednym parametrem wejściowym.

Definicja tego operatora różni się od analogicznej dla przedrostkowego :


  • użyciem lokalnego obiektu o nazwie temp będącego kopią obiektu (przed działaniem operatora inkrementacji) na który działa operator.

  • przekazaniem tego obiektu na wyjście metody definiującej działanie operatora

  • inkrementacja wartości liczba_osob dotyczy zatem wyłącznie postaci obiektu będącego operandem po zakończeniu inkrementacji

Wyniki działania programu przedstawione na konsoli wyjściowej (obraz 3.24.) potwierdzają prawidłowe działanie przeciążonego operatora inkrementacji przedrostkowej i przyrostkowej


Obiekt pomocniczy test utworzony w celu wykonania operacji podstawienia typu :
test = ++g1;
test = g1++;
wykorzystywany jest do sprawdzenia istoty działania operatora ++ stojącego przed i za obiektem.
W przypadku inkrementacji przedrostkowej operator ++ działa w pierwszej kolejności na obiekt, a dopiero później wykonywana jest operacja podstawienia. Inkrementacja przyrostkowa modyfikuje obiekt po dokonanej operacji podstawienia.

Obraz 3.24. Przeciążenie operatorów inkrementacji przedrostkowej i przyrostkowej


Analogiczne przykłady można utworzyć w celu przedstawienia możliwość przeciążania operatora dekrementacji przedrostkowej i przyrostkowej.




      1. Przeciążenie dwuargumentowego operatora dodawania.

Operator dodawania w prezentowanym w poprzednim rozdziale przykładzie mógłby być zastosowany w przypadku gdy jego operandami byłyby obiekty klasy grupa. Dodawanie wartości zmiennych wewnętrznych liczba_osob dla dwóch obiektów tej klasy można zrealizować poprzez wywołanie zdefiniowanej metody klasy lub poprzez przeciążenie dwuargumentowego operatora dodawania (+). W przypadku przeciążenia, argumentami operatora + będą obiekty klasy grupa.





  1   2   3   4


©operacji.org 2017
wyślij wiadomość

    Strona główna