15. Typy metod: konstruktory i destruktory, selektory, zapytania, iteratory.
Konstruktory
- są to metody klasy, które są uruchamiane automatycznie podczas tworzenia obiektu danej klasy.
- każda klasa może posiadać kilka konstruktorów. Podobnie jak to miało miejsce z funkcjami przeciążonymi, każdy z tych konstruktorów musi się różnić argumentami, które do niego trafiają.
- istotne jest, że konstruktory nie zwracają żadnych wartości. W skrócie można powiedzieć, że konstruktory służą do nadawania wartości początkowych składowym klasy.
- Konstruktory zawsze mają taką samą nazwę jak klasa, w której są umieszczone.
- Konstruktory mogą być bezargumentowe lub mogą posiadać argumenty.
Destruktory
- to specjalne metody klasy, które nie przyjmują żadnych argumentów i nic nie zwracają.
- Destruktor nosi taką samą nazwę jak klasa, z której pochodzi, ale przed jego nazwą stawiamy tyldę. Dla klasy osoba destruktor ma postać: ~osoba().
- W destruktorze umieszcza się wszystkie instrukcje, które powinny być wykonane podczas usuwania danego obiektu klasy. Jest to szczególnie istotne, gdy w obiektach klasy umieszczamy instrukcje dynamicznie rezerwujące pamięć. W takim wypadku destruktor powinien zwolnić tą pamięć.
Selektory - wskaźnikowe selektory składowych, np. ->* i .*
Zapytania - funkcje, pobiera dane np.: z bazy lub obiektu klasy.
Iteratory - są kluczowym elementem biblioteki STL. STL definiuje następujące typy iteratorów:
wejściowe - (input iterator) można pobrać obiekt wskazywany przez iterator oraz dokonać jego inkrementacji, tak aby wskazywał na kolejny obiekt. Dla tego typu iteratorów zdefiniowano operatory ++ post- i preinkrementujące. Dla dwóch iteratorów wejściowych zdefiniowana jest odległość między nimi, oznaczająca liczbę elementów w zakresie wyznaczanym przez iteratory. Iteratory wejściowe nie mogą być używane w algorytmach wielokrotnie przechodzących przez wyznaczany przez nie zakres.
wyjściowe (output iterator) - mają podobne właściwości do iteratorów wejściowych, ale pozwalają na zapis wartości we wskazywanym obiekcie. Możliwość zapisu nie jest jednak tożsama z możliwością dostępu do obiektu. Iteratory wyjściowe nie muszą też mieć określonej odległości między sobą. Można wyobrazić sobie iterator wyjściowy jako taśmę, na której dokonuje się zapisu w aktualnym położeniu, przesuwa ją do przodu, ale nie można jej odczytywać i przewijać wstecz.
postępujące (forward iterator) - pozwalają przejść do następnego elementu. W odróżnieniu od iteratora wejściowego, iterator postępujący nie unieważnia kopii starej wartości oraz gwarantuje, że jeśli dla iteratorów i oraz j i==j, to ++i==++j. W konsekwencji możliwe jest przejście przez dany iterator wiele razy.
dwukierunkowe (bidirectional iterator) - pozwalają zarówno na inkrementację, jak i dekrementację. Możliwość dekrementacji, czyli przejścia wstecz, jest jedyną cechą odróżniającą iterator dwukierunkowy od postępującego.
dostępu swobodnego (random acceess iterator) - udostępniają inkrementację, dekrementację, jak również przesuwanie się do przodu i do tyłu o kilka elementów. Dla iteratorów dostępu swobodnego definiuje się
- operacje dodawania i odejmowania wartości do i od iteratora,
- operację odejmowania iteratorów, zwracającą w wyniku dystans dzielący iteratory,
- operator mniejszości
- operator dostępu do n-tego elementu.