Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Klasy ( uzupełnienie ). Definicja klasy Klasa jest zbiorem logicznie powiązanych danych i funkcji, przeznaczonych do realizacji konkretnego zadania; Zamknięcie.

Podobne prezentacje


Prezentacja na temat: "Klasy ( uzupełnienie ). Definicja klasy Klasa jest zbiorem logicznie powiązanych danych i funkcji, przeznaczonych do realizacji konkretnego zadania; Zamknięcie."— Zapis prezentacji:

1 Klasy ( uzupełnienie )

2 Definicja klasy Klasa jest zbiorem logicznie powiązanych danych i funkcji, przeznaczonych do realizacji konkretnego zadania; Zamknięcie związanych ze sobą elementów w jedną całość nazywa się hermetyzacją lub enkapsulacją.

3 Anatomia klasy Klasa, podobnie jak struktura, musi być zadeklarowana; Deklarację klasy umieszczamy na ogół w oddzielnym pliku nagłówkowym; W przypadku prostszych klas możliwe jest łączenie deklaracji w jeden plik z definicją; Plik źródłowy zawierający definicję klasy ma rozszerzenie.CPP; Plik nagłówkowy z deklarację klasy ma tę samą nazwę, co plik źródłowy i rozszerzenie.H.

4 C++ definiuje 3 kategorie dostępu do elementów klasy; Odpowiadają za to kwalifikatory dostępu: –private (prywatny) –public (publiczny) –protected (chroniony) Poziomy dostępu określają sposób wykorzystania elementów klasy przez jej użytkowników. Dostęp do elementów klasy

5 W przypadku małych projektów użytkownikiem jest na ogół autor klasy; W dużych projektach klasa utworzona przez jednego z członków zespołu jest wykorzystywana przez pozostałych; Ponieważ każda klasa musi się komunikować z otoczeniem, powinna posiadać część publiczną (interfejs), czyli elementy, do których można odwołać się z zewnątrz; Dostęp do elementów klasy

6 Z drugiej strony, wewnętrzne funkcje klasy nie powinny być widzialne ani dostępne z zewnątrz; Funkcje te tworzą część prywatną, czyli implementacyjną klasy; Abstrahowaniem danych nazywamy ukrywanie wewnętrznych szczegółów implementacyjnych klasy przed dostępem z zewnątrz;

7 Abstrahowanie danych jest jednym z elementów sztuki dobrego projektowania klas; Ogranicza ono dostęp użytkowników do danych zawartych w klasie do niezbędnego minimum; Z drugiej strony, zabezpiecza ono wewnętrzne mechanizmy klasy przed niepożądaną ingerencją z zewnątrz; Elementy klasy objęte dostępem chronionym są dostępne z zewnątrz tylko dla klas pochodnych (danej klasy). Dostęp do elementów klasy

8 Wcale nie musisz wykorzystywać wszystkich kategorii dostępu; Możesz wręcz nie wykorzystać żadnej; Ale dobrze zaprojektowana klasa posiada sekcję publiczną (interfejs) i sekcję prywatna (implementacyjną); Domyślna kategorią dostępu dla wszystkich elementów klasy jest private. Jeśli nie użyjesz w deklaracji klasy żadnego kwalifikatora dostępu, wszystkie jej dane i funkcje będą prywatne, a więc niedostępne z zewnątrz; Przydatność takiej klasy jest wątpliwa.

9 Konstruktory Klasy języka C++ wyposażone są w specjalną funkcję zwaną konstruktorem; Konstruktor jest specjalną funkcją składową, wywoływaną zawsze w chwili tworzenia obiektu danej klasy; Zadaniem konstruktora jest inicjalizacja danych składowych (pól) obiektu danej klasy, przydzielenie pamięci dla jego elementów oraz wykonanie innych czynności niezbędnych do prawidłowego utworzenia obiektu; Konstruktor nie jest obowiązkowym elementem definicji klasy.

10 Jeśli tworząc klasę nie zdefiniujesz jawnie jej konstruktora, kompilator automatycznie wygeneruje tzw. konstruktor domyślny; Rozwiązanie takie, choć dość wygodne, sprawdza się tylko dla bardzo prostych klas; W praktyce każda definicja nietrywialnej klasy będzie zawierała konstruktor; Nazwa konstruktora musi być taka sama, jak nazwa zawierającej go klasy; Konstruktor nie może zwracać żadnej wartości. Konstruktory

11 Klasa może posiadać więcej niż jeden konstruktor; Jest to możliwe dzięki mechanizmowi przeciążania funkcji; Konstruktory

12 Przypomnienie - niezainicjalizowane zmienne będą zawierały przypadkowe wartości; Reguła ta odnosi się również do klas; Dobra praktyka wymaga inicjalizowania wszystkich pól klasy; Przypomnienie - konstruktora nie można wywołać jawnie; Wywołanie konstruktora następuje w chwili tworzenia obiektu danej klasy ; W chwili powoływania obiektu wybierasz również wersję konstruktora, jeżeli dana klasa definiuje ich więcej. Konstruktory (p. PROG155.CPP, PROG155a.CPP)

13 Destruktor jest specjalną funkcją wywoływaną w chwili likwidacji obiektu danej klasy; Destruktor jest funkcjonalnym przeciwieństwem konstruktora; Do jego zadań należy najczęściej zwalnianie zasobów wykorzystywanych przez obiekt i inne czynności natury porządkowej; Destruktor nie jest obowiązkowym elementem klasy; Destruktor możesz zdefiniować tylko raz ; Destruktor jest funkcją bezparametrową i nie zwracającą żadnej wartości; Nazwa składa się z nazwy klasy poprzedzonej znakiem ~. Destruktory (p. PROG156.CPP, PROG157.CPP)

14 Destruktor jest wywoływany w chwili usuwania obiektu danej klasy; Sama likwidacja obiektu może nastąpić poprzez –usunięcie go ze stosu, jeśli jest to obiekt lokalny, a operująca na nim funkcja właśnie zakończyła działanie; –lub w wyniku wywołania operatora delete, jeśli obiekt został utworzony dynamicznie. W obu przypadkach wywołanie destruktora jest ostatnią czynnością obiektu przed jego unicestwieniem; Destruktory

15 Pola klasy to nic więcej, jak tylko jej lokalne zmienne; Pola klasy funkcjonują tak samo, jak pola struktury i różnią się od ostatnich wyłącznie domyślną kategorią dostępu; Wewnątrz klasy wszystkie pola są swobodnie dostępne dla wszystkich funkcji składowych; Natomiast ich widoczność na zewnątrz klasy jest uwarunkowana kwalifikatorami dostępu; Pola w sekcjach private i protected są na zewnątrz niedostępne; Pola public mogą być czytane i zapisywane spoza klasy bez ograniczeń. Pola

16 Rozwiązaniem problemu dostępu do pól prywatnych są specjalne funkcje klasy ustawiające i pobierające wartości tych pól; Funkcje te, zwane funkcjami udostępniającymi, deklarowane są oczywiście w sekcji publicznej; Fundamentaliści: ” wszystkie pola klas powinny być prywatne, a dostęp do nich ma byś realizowany wyłącznie za pomocą funkcji udostępniających”; Radykałowie: ” wręcz przeciwnie”; Wytyczenie granicy jest kwestią doświadczenia i zdrowego rozsądku; Jeśli nie wiesz, co robić z danym polem, umieść go w sekcji prywatnej. Pola

17 Zestaw publicznych funkcji składowych powinien być ograniczony do niezbędnego minimum zapewniającego skuteczną komunikację z obiektami i kontrolowanie ich działania; Jeśli dana funkcja składowa nie musi być widoczna na zewnątrz, powinna być zadeklarowana jako prywatna; Jeśli dana funkcja składowa nie musi być widoczna na zewnątrz, ale powinna być dostępna dla klas pochodnych, powinna być zadeklarowana jako chroniona (protected); Jeśli zależy Ci na szybkim wykonaniu funkcji, a jednocześnie jest ona niewielka, możesz zadeklarować ją jako funkcję wstawianą (inline); Funkcje

18 Deklaracja każdej klasy zawiera ukryte pole wskaźnikowe o nazwie this; Po utworzeniu obiektu, wskaźnik this zawiera adres obiektu w pamięci; Oto klasa Punkt widziana oczami komputera: Wskaźnik this Class Punkt { private: Punkt *this; int x, y; public: Punkt (int _x, int _y); ~Punkt().... };

19 Czemu służy wskaźnik this ?; Każdy obiekt danej klasy posiada własną kopię zestawu pól; Natomiast funkcje składowe są przechowywane w jednym egzemplarzu; Wskaźnik this pozwala na zidentyfikowanie właściciela danych, do których odwołuje się funkcja składowa; Jeśli chcesz uniknąć kłopotów, nigdy nie zmieniaj wartości wskaźnika this! Wskaźnik this

20 Dziedziczenie Dziedziczeniem nazywamy proces tworzenia nowych klas na podstawie klas już istniejących; Klasa wykorzystywana jako podstawa w procesie dziedziczenia jest klasą bazową; Klasy dziedziczące po klasie bazowej są to klasy pochodne; Klasa pochodna dziedziczy wszystkie możliwości funkcjonalne klasy bazowej, poszerzone o nowe pola i funkcje; Niemożliwe jest usunięcie jakichkolwiek elementów klasy bazowej. (p. PROG159.CPP, PROG160.CPP)

21 Dziedziczenie Samo dziedziczenie symbolizowane jest przez znajdujący się w pierwszym wierszu deklaracji klasy dwukropek, po którym występuje nazwa klasy bazowej ; Słowo kluczowe virtual deklaruje poprzedzoną nim funkcję jako wirtualną; Jako przykład funkcji wirtualnych rozpatrz funkcje o nazwie Pokaz() w klasach Punkt i Linia_Pozioma; Ponieważ procedura narysowania na ekranie linii różni się od procedury narysowania punktu, należy w klasie Linia_Pozioma przedefiniować (przesłonić) funkcję Pokaz().

22 Przesłanianie Przesłanianiem nazywamy przedefiniowywanie funkcji klasy bazowej w klasach pochodnych ; Przesłanianie stosuje się w celu całkowitej zmiany działania funkcji klasy bazowej lub, znacznie częściej, jej uzupełnienia i rozszerzenia o dodatkowe operacje; Aby rozszerzyć pierwotną definicję nie musisz jej przepisywać. W nowej definicji funkcji wystarczy najpierw wywołać funkcję klasy bazowej, a następnie dopisać kod realizujący rozszerzenia; Przesłaniając funkcje klasy bazowej musisz zapewnić identyczność nagłówków funkcji; Istotne jest również aby funkcja była dostępna dla klas pochodnych.

23 Przesłanianie Odwołując się do funkcji klasy bazowej musisz poprzedzić ją nazwą klasy i operatorem zakresu; Użycie operatora zakresu jest konieczne tylko wtedy, gdy wywoływana funkcja jest zdefiniowana zarówno w klasie bazowej, jak i pochodnej ; Jeśli funkcja jest zdefiniowana tylko w sekcji publicznej lub chronionej klasy bazowej, a nie wchodzi w skład definicji klasy pochodnej, możesz ją wywołać bez użycia operatora zakresu.

24 Funkcje wirtualne Funkcją wirtualną nazywamy funkcję wywoływaną zawsze w obrębie posiadającej ją klasy; Poprzedzenie deklaracji słowem kluczowym virtual powoduje, że wszystkie odwołania do funkcji będą zawsze wykonywane w obrębie klasy, która ją zdefiniowała; Jeśli podejrzewasz, że funkcja będzie przedefiniowywana w klasach pochodnych, warto deklarować ją jako wirtualną; Jeśli przedefiniowywana funkcja jest wywoływana przez inne funkcje klasy bazowej, prawie na pewno powinieneś zadeklarować ją jako wirtualną.

25 Inicjalizacja obiektów Kolejnym problemem związanym z dziedziczeniem jest inicjalizacja obiektów; W chwili utworzenia obiektu klasy pochodnej należy zainicjalizować też pola klasy bazowej, a w przypadku dziedziczenia „piętrowego” - również wszystkich klas pośrednich; Najskuteczniejszym na to sposobem jest po prostu wywołanie konstruktora klasy bazowej w konstruktorze klasy pochodnej; Ponieważ nie można wywołać tego konstruktora bezpośrednio, należy wykorzystać w tym celu listę inicjalizującą ; Prawidłowa inicjalizacja klasy bazowej w konstruktorze klasy pochodnej jest sprawą bardzo istotną.

26 Programy przykładowe PROG155.CPP PROG155a.CPP PROG156.CPP PROG157.CPP PROG159.CPP PROG160.CPP


Pobierz ppt "Klasy ( uzupełnienie ). Definicja klasy Klasa jest zbiorem logicznie powiązanych danych i funkcji, przeznaczonych do realizacji konkretnego zadania; Zamknięcie."

Podobne prezentacje


Reklamy Google