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

Slides:



Advertisements
Podobne prezentacje
C++ wykład 2 ( ) Klasy i obiekty.
Advertisements

C++ wykład 4 ( ) Przeciążanie operatorów.
Język C/C++ Funkcje.
Programowanie obiektowe
Związki w UML.
Programowanie obiektowe PO PO - LAB 2 Wojciech Pieprzyca.
Deklaracje i definicje klas w C++ Składowe, pola, metody Konstruktory
Programowanie obiektowe
Programowanie obiektowe
Programowanie obiektowe
Wzorce.
Prowadzący: mgr inż. Elżbieta Majka
Static, const, volatile.
Dziedziczenie. Po co nam dziedziczenie? class osoba { char * imie, char * imie, * nazwisko; * nazwisko;public: void wypisz_imie(); void wypisz_imie();
PROGRAMOWANIE STRUKTURALNE
Programowanie obiektowe w Javie
ODE Triggery. Wstęp n Triggery są trójką zdarzenie-warunek-akcja (event-condition- action). n Zdarzenia mogą być proste lub złożone, co zostanie omówione.
Kurs Pascala – spis treści
Struktury.
Tablice.
Dziedziczenie i jego rodzaje
C++ wykład 6 ( ) Polimorfizm.
C++ wykład 2 ( ) Klasy i obiekty.
Zasady zaliczenia Warunki uzyskania zaliczenia:
Pakiety i ATD 1 Definicja. Pakietem albo jednostką programową nazywamy grupę logicznie powiązanych elementów, które mogą być typami, podtypami, obiektami.
Dynamiczne struktury danych 1
Typy prywatne 1 Typy prywatne W Adzie typy prywatne (private types) służą do bezpiecznego udostępniania danych zdefiniowanych w pakiecie, z którego korzysta.
Języki programowania obiektowego
Wstęp do programowania obiektowego
Projektowanie i programowanie obiektowe II - Wykład II
Semafory według normy POSIX
Podstawy programowania II
T: Różnice pomiędzy programowaniem strukturalnym a obiektowym
Źródła: podręcznikopracował: A. Jędryczkowski.
Programowanie strukturalne i obiektowe
Programowanie obiektowe III rok EiT
Programowanie obiektowe III rok EiT dr inż. Jerzy Kotowski Wykład XIII.
Programowanie obiektowe III rok EiT
WPROWADZENIE W ŚWIAT OBIEKTÓW
Andrzej Repak Nr albumu
Java – coś na temat Klas Piotr Rosik
Dziedziczenie Marek Serek Dziedziczenie Dziedziczenie to jeden z fundamentów programowania obiektowego. Umożliwia sprawne i łatwe wykorzystywanie.
Dziedziczenie Maciek Mięczakowski
Inicjalizacja i sprzątanie
Programowanie obiektowe Wykład 3 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Dariusz Wardowski.
Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Dariusz Wardowski.
Programowanie obiektowe 2013/2014
Prasek Aneta, Skiba Katarzyna. Funkcje stałe const to takie funkcje, które nie mogą modyfikować stanu obiektu. Oznacza to, że funkcja stała nie może zmieniać.
Kurs języka C++ – wykład 3 ( )
Programowanie w języku C++
Kurs języka C++ – wykład 5 ( )
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski informatyka +
Programowanie strukturalne i obiektowe C++
Model obiektowy bazy danych
Kurs języka C++ – wykład 4 ( )
K URS JĘZYKA C++ – WYKŁAD 2 ( ) Klasy i obiekty.
Projektowanie obiektowe. Przykład: Punktem wyjścia w obiektowym tworzeniu systemu informacyjnego jest zawsze pewien model biznesowy. Przykład: Diagram.
Dziedziczenie wielobazowe. dana klasa może mieć kilka bezpośrednich klas bazowych: dana klasa może mieć kilka bezpośrednich klas bazowych: kolorpołożenie.
Programowanie Zaawansowane
Dziedziczenie Wykład 7 Dziedziczenie sekwencyjne
Tryby adresowania i formaty rozkazów mikroprocesora
Partnerstwo dla Przyszłości 1 Lekcja 28 Dziedziczenie i rodzaje dziedziczenia.
K URS JĘZYKA C++ – WYKŁAD 3 ( ) Przenoszenie Składowe statyczne Funkcje wbudowane Argumenty domyślne.
Programowanie Obiektowe – Wykład 6
Typy wyliczeniowe, kolekcje
Kurs języka C++ – wykład 3 ( )
Klasy, pola, obiekty, metody. Modyfikatory dostępu, hermetyzacja
Programowanie Obiektowe – Wykład 2
Kurs języka C++ – wykład 4 ( )
Zapis prezentacji:

Klasy ( uzupełnienie )

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ą.

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.

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

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

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;

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

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.

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.

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

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

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)

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)

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

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

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

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

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().... };

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

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)

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().

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.

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.

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ą.

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ą.

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