Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Programowanie obiektowe 2013/2014

Podobne prezentacje


Prezentacja na temat: "Programowanie obiektowe 2013/2014"— Zapis prezentacji:

1 Programowanie obiektowe 2013/2014
Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego Matuszyka

2 Programowanie obiektowe
Programowanie obiektowe (ang. object-oriented programming) – metodologia tworzeniu programów, która definiuje programy za pomocą obiektów. Obiekty to elementy łączące stan (czyli dane) i zachowanie (czyli procedury, w terminologii obiektowej: metody). Program obiektowy wyrażony jest jako zbiór obiektów, komunikujących się pomiędzy sobą w celu wykonywania zadań. Podejście obiektowe różni się od tradycyjnego programowania proceduralnego, gdzie dane i procedury nie są ze sobą bezpośrednio związane.

3 Programowanie obiektowe
Program zdefiniowany za pomocą obiektów, elementów łączących stan (dane) i zachowanie (procedury, czyli metody). Podstawowe cechy: abstrakcja enkapsulacja polimorfizm dziedziczenie

4 Podstawowe założenia paradygmatu obiektowego
Abstrakcja Każdy obiekt w systemie służy jako model abstrakcyjnego wykonawcy, który może wykonywać pracę, opisywać i zmieniać swój stan, oraz komunikować się z innymi obiektami w systemie bez ujawniania, w jaki sposób zaimplementowano dane cechy.

5 Podstawowe założenia paradygmatu obiektowego
Enkapsulacja (ukrywanie implementacji, hermetyzacja) Zapewnia, że obiekt nie może zmieniać stanu wewnętrznego innych obiektów w nieoczekiwany sposób. Tylko wewnętrzne metody obiektu są uprawnione do zmiany jego stanu. Każdy typ obiektu prezentuje innym obiektom swój interfejs, który określa dopuszczalne metody współpracy.

6 Podstawowe założenia paradygmatu obiektowego
Dziedziczenie Umożliwienia definiowanie i tworzenie specjalizowanych obiektów na podstawie bardziej ogólnych. Dla obiektów specjalizowanych nie trzeba redefiniować całej funkcjonalności, lecz tylko tą, której nie ma obiekt ogólniejszy. W typowym przypadku powstają grupy obiektów zwane klasami, oraz grupy klas zwane drzewami. Odzwierciedlają one wspólne cechy obiektów.

7 Podstawowe założenia paradygmatu obiektowego
Polimorfizm Referencje i kolekcje obiektów mogą dotyczyć obiektów różnego typu, a wywołanie metody dla referencji spowoduje zachowanie odpowiednie dla pełnego typu obiektu wywoływanego. Jeśli dzieje się to w czasie działania programu, to nazywa się to późnym wiązaniem lub wiązaniem dynamicznym.

8 Własny typ… C++ pozwala na definiowanie własnego typu danych, z którego można korzystać tak samo jak z typu wbudowanego. Typ jest konkretną reprezentacją idei lub pomysłu. Typ, to nie tylko dane (liczby, napisy, etc.) ale także i zbiór operacji, które można na obiekcie tego typu wykonać (np. typ int z operacjami +, -, *, /). Łatwiej jest zrozumieć i zmodyfikować program, który zawiera typy ściśle odpowiadające pojęciom z dziedziny zastosowań, niż program, który tego nie robi.

9 Własny typ… Do opisu nowego typu definiujemy nową klasę. class nazwa_klasy { //ciało kalsy }; Zdefiniowaliśmy nowy typ o nazwie nazwa_klasy. Jeśli w przyszłości zechcemy utworzyć egzemplarz obiektu tej klasy, wówczas wystarczy napisać: nazwa_klasy obiektA; Można również utworzyć obiekty typów pochodnych: nazwa_klasy *wsk; nazwa_klasy tab[10]; nazwa_klasy funkcja();

10 Składowe klasy (klasa data)
Atrybuty (dane): Do opisu daty potrzebne są trzy dane: rok, miesiąc i dzień. Wszystkie te dane są typu całkowitoliczbowego: struct data { unsigned short int d,m; short r; }; Metody (funkcje): Potrzebne są jeszcze (dozwolone) operacje, które można wykonać na obiekcie typu data. Mogą to być np.: data wprowadz(unsigned short int, unsigned short int, short int); void wypisz(data); Nie ma powiązania pomiędzy danymi a funkcjami!

11 Klasa data Aby powiązać dane z funkcjami, czyli aby wskazać, że na obiektach typu data mogą tylko działać te, a nie inne funkcje potrzeba zdefiniować nową klasę: class data { unsigned short int d,m; short int r; public: void wprowadz(unsigned short int, unsigned short int, short int); void wypisz(); };

12 Ukrywanie informacji Nie wszystkie składowe klasy muszą być widoczne na zewnątrz, tzn. nie wszystkie atrybuty czy metody klasy mogą być dostępne spoza klasy. Istnieją trzy etykiety, za pomocą których można określać dostęp do składników klasy: private – składowa dostępna tylko dla funkcji składowych klasy (i zaprzyjaźnionych), protected – dostępny tak, jak składnik private, a także dostępny w klasach pochodnych danej klasy, public – składowa dostępna bez ograniczeń.

13 Ukrywanie informacji Etykiety można umieszczać w dowolnej kolejności. Etykiety mogą się powtarzać. Zawsze oznaczają, że składowe klasy, które występują po danej etykiecie mają określoną dostępność. Zakłada się, że dopóki w definicji klasy nie wystąpi żadna z powyższych etykiet – składowe klasy są przez domniemanie składowymi prywatnymi.

14 Ukrywanie informacji #include<iostream> using namespace std; class liczby { int liczba1; public: int liczba2; }; int main() { liczby dane; dane.liczba2=1; dane.liczba1=1; return 0; } BŁĄD

15 Ukrywanie informacji #include<iostream> using namespace std; class liczby { int liczba1; public: int liczba2; void wprowadz(); void wypisz(); }; void liczby::wprowadz() {cin>>liczba1;} void liczby::wypisz() {cout << liczba1 << endl;} int main() { liczby dane; dane.liczba2=1; dane.wprowadz(); dane.wypisz(); return 0; }

16 Ukrywanie informacji #include<iostream> using namespace std; class liczby { void wypisz(); public: int liczba; void wprowadz(); }; void liczby::wprowadz() {cin>>liczba; wypisz();} void liczby::wypisz() {cout << liczba << endl;} int main() { liczby dane; dane.wprowadz(); dane.wypisz(); return 0; } BŁĄD

17 Klasa a obiekt Definicja klasy nie definiuje żadnych obiektów!
Klasa to typ obiektu a nie sam obiekt! class data { unsigned short int d=1,m=1; short int r=2000; public: void wprowadz(unsigned short int, unsigned short int, short int); void wypisz(); }; W definicji klasy atrybuty nie mogą mieć inicjalizatora Konkretne dane wpisuje się dopiero dla konkretnego egzemplarza obiektu danej klasy. BŁĄD

18 Klasa a obiekt Mając gotowy projekt (definicję klasy) można utworzyć egzemplarze obiektów danej klasy: data dzis, jutro; Każdy obiekt (egzemplarz) klasy znajduje się w swoim odrębnym miejscu w pamięci komputera. Metody klasy składowane są w pamięci tylko jednokrotnie (bo są wspólne dla wszystkich obiektów tej klasy).

19 Odwoływanie się do składowych klasy
#include<iostream> using namespace std; class liczby { public: int liczba; int *wskaznik; int tablica[5]; }; int main() { liczby dane, *wsk_dane; wsk_dane=&dane; dane.liczba=1; cout << wsk_dane->liczba << endl; return 0; }

20 Odwoływanie się do składowych klasy
#include<iostream> using namespace std; class liczby { public: int liczba; int *wskaznik; int tablica[5]; }; int main() { liczby dane, *wsk_dane; wsk_dane=&dane; dane.wskaznik=dane.tablica; for(int i=0;i<5;i++) dane.tablica[i]=2*i; cout<<wsk_dane->tablica[1]<<endl; cout<<*dane.wskaznik<<endl; cout<<*wsk_dane->wskaznik+1<<endl; return 0; }

21 Definiowanie funkcji składowych
class data { unsigned short int d,m; short int r; public: void wprowadz(unsigned short int, unsigned short int, short int); void wypisz(); }; void data::wprowadz(unsigned short int a, unsigned short int b, short int c) d=a;m=b;r=c; } void data::wypisz() cout<<d<<'.'<<m<<'.'<<r<<endl;

22 Definiowanie funkcji składowych
class data { unsigned short int d,m; short int r; public: void wprowadz(unsigned short int a, unsigned short int b, short int c) d=a;m=b;r=c; } void wypisz() cout<<d<<'.'<<m<<'.'<<r<<endl; }; FUNKCJE INLINE!

23 Definiowanie funkcji składowych
Plik data.cpp: #include<iostream> #include„data.h" using namespace std; void data::wprowadz(unsigned short int a, unsigned short int b, short int c) { d=a;m=b;r=c; } void data::wypisz() cout<<d<<'.'<<m<<'.'<<r<<endl; Plik data.h: #ifndef DATA_H #define DATA_H class data { unsigned short int d,m; short int r; public: void wprowadz(unsigned short int, unsigned short int, short int); void wypisz() }; #endif

24 Program główny #include<iostream> #include"data.h" using namespace std; int main() { data dzis; dzis.wprowadz(13,1,2014); dzis.wypisz(); }

25 Konstruktor Używanie funkcji wprowadz do inicjacji obiektów jest nieeleganckie i może prowadzić do błędów. Programista, używając klasy, może zapomnieć zainicjować obiekt lub zrobić to kilkukrotnie, co może spowodować błędy w działaniu programu. Lepszym podejściem jest umożliwienie deklarowania funkcji jawnie przeznaczonej do inicjacji obiektów. Funkcja taka konstruuje wartości danego typu, dlatego nazywana jest konstruktorem.

26 Konstruktor #include<iostream> #include "data.h" using namespace std; data::data() { d=1; m=1; r=2014;} data::data(unsigned short int a, unsigned short int b, short int c) d=a; m=b; r=c; } void data::wypisz() cout<<d<<'.'<<m<<'.'<<r<<endl; #ifndef DATA_H #define DATA_H class data { unsigned short int d,m; short int r; public: data(); data(unsigned short int, unsigned short int, short int); void wypisz() }; #endif

27 Konstruktor #include<iostream> #include "data.h" using namespace std; int main() { data pierwsza; pierwsza.wypisz(); data druga=data(13,1,2014); druga.wypisz(); data trzecia(14,1,2014); trzecia.wypisz(); return 0; }

28 Lista inicjalizacyjna konstruktora
Składnikowi nie-const możemy w konstruktorze nadać wartość na dwa sposoby: przez listę inicjalizacyjną przez zwykłe podstawienie w ciele konstruktora Składnikowi const można nadać wartość początkową tylko za pomocą listy inicjalizacyjnej. Lista inicjalizacyjna nie może inicjalizować składnika static.

29 Lista inicjalizacyjna konstruktora
class liczby { int liczba1; const int liczba2; public: liczby(int,int); }; liczby::liczby(int a, int b):liczba2(b) liczba1=a; }

30 Destruktor #include<iostream> #include„data.h" using namespace std; data::data() { d=1; m=1; r=2014;} data::data(unsigned short int a, unsigned short int b, short int c) d=a; m=b; r=c; } data::~data() cout << "Kasuje date"<<endl; void data::wypisz() cout<<d<<'.'<<m<<'.'<<r<<endl; #ifndef DATA_H #define DATA_H class data { unsigned short int d,m; short int r; public: data(); data(unsigned short int, unsigned short int, short int); ~data(); void wypisz() }; #endif

31 Konstruktor nie może nic zwracać – nawet typu void.
Konstruktor – cechy Konstruktor nie może nic zwracać – nawet typu void. Konstruktor nie może być funkcją typu const ani volatile static virtual Nie można posługiwać się adresem konstruktora. Jeżeli obiekt ma być składnikiem unii to nie może mieć żadnego konstruktora.

32 Konstruktor – kiedy jest wywoływany
Obiekty lokalne automatyczne – w momencie gdy program napotka definicje obiektu. Obiekty lokalne statyczne – przed rozpoczęciem wykonywania funkcji main. Obiekty globalne – przed rozpoczęciem wykonywania funkcji main. Obiekty tworzone operatorem new – w momencie użycia operatora new. Przy jawnym wywołaniu.

33 Konstruktor – kiedy jest wywoływany
W przypadku klas zagnieżdżonych: Najpierw wywoływane są konstruktory klas wewnętrznych. Później konstruktor klasy zewnętrznej. Destruktory wywoływane są w odwrotnej kolejności. Przydomek explicit oznacza wyłącznie do użytku jawnego.

34 Destruktor – cechy Destruktor nie może nic zwracać – nawet typu void.
Destruktor nie może być funkcją typu const ani volatile static virtual Nie można posługiwać się adresem destruktora. Jeżeli obiekt ma być składnikiem unii to nie może mieć destruktora. Destruktor nie może mieć żadnych argumentów -> nie może być przeładowany.

35 Konstruktor domniemany
Konstruktor domniemany to konstruktor, który można wywołać bez żadnego argumentu. class kl{ //... public: kl(int); kl(float); kl(int a=2, float b=3); <- domniemany }; class kl{ //... public: kl(int); kl(float); kl(); <- domniemany };

36 Konstruktory nie-publiczne
Konstruktor obowiązują zwykłe reguły dostępu ustalane za pomocą public, protected, private. Klasa, która nie ma konstruktorów publicznych nazywana jest klasą prytatną. Jak tworzyć obiekty za pomocą konstruktorów nie-publicznych? Obiekty klasy mają dostęp do składników prywatnych – tylko skąd się weźmie pierwszy obiekt? Funkcje lub klasy zaprzyjaźnione.

37 Konstruktor kopiujący
Konstruktor kopiujący danej klasy to konstruktor, który można wywołać z jednym argumentem – referencją do obiektu tej klasy, np.: class kl{ //... public: kl(kl &); kl(const kl &); kl(volatile kl &); kl(const volatile kl &); kl(kl &, int a=1); //ten nie może współistnieć z pierwszym – //zasady dotyczące przeładowań nazw funkcji };

38 Konstruktor kopiujący
Konstruktor kopiujący służy do skonstruowania obiekty, który jest kopią innego, już istniejącego. Jeżeli nie jest zdefiniowany, kompilator wygeneruje go sam. Jawne wywołanie: kl nowy=stary; Niejawne wywołania: Podczas przesyłania obiektu do funkcji Podczas odbierania obiektu z funkcji

39 Konstruktor kopiujący
Konstruktor kopiujący jako argument przyjmuje referencję do obiektu -> może zmienić kopiowany obiekt!!! class kl{ int a; public: kl(){a=0;} kl(int a):a(a){} kl(kl &A){a=A.a;}}; int main(){ const kl wzor(1); kl nowy=wzor;} //BŁĄD – konstruktor kopiujący nie //obiecał że nie zmieni wzoru a jest on //const

40 Konstruktor kopiujący
Rozwiązanie: class kl{ int a; public: kl(){a=0;} kl(int a):a(a){} kl(const kl &A){a=A.a;}}; int main(){ const kl wzor(1); kl nowy=wzor;}

41 Konstruktor kopiujący
Kiedy konstruktor kopiujący jest niezbędny? Za pomocą generowanego automatycznie konstruktora kopiującego, przy inicjalizacji nowego obiektem wzorcowym, powstaje dokładna kopia obiektu wzorcowego. Czasem taka kopia jest niepożądana! Np. jeśli klasa ma jako składową tablicę tworzoną dynamicznie, taki konstruktor kopiuje tylko wskaźnik, a nie tablicę! Klasa, w której jest: destruktor, konstruktor kopiujący lub przeładowany operator przypisania najczęściej wymaga istnienia ich wszystkich trzech!

42 Prezentacja udostępniona na licencji Creative Commons: Uznanie autorstwa, Na tych samych warunkach 3.0. Pewne prawa zastrzeżone na rzecz autorów. Zezwala się na dowolne wykorzystywanie treści pod warunkiem wskazania autorów jako właścicieli praw do prezentacji oraz zachowania niniejszej informacji licencyjnej tak długo, jak tylko na utwory zależne będzie udzielana taka sama licencja. Tekst licencji dostępny jest na stronie:


Pobierz ppt "Programowanie obiektowe 2013/2014"

Podobne prezentacje


Reklamy Google