Programowanie obiektowe 2013/2014

Slides:



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

Programowanie obiektowe
Programowanie obiektowe PO PO - LAB 2 Wojciech Pieprzyca.
Programowanie obiektowe
Programowanie obiektowe
Programowanie obiektowe
Programowanie obiektowe
Programowanie obiektowe PO PO - LAB 3 Wojciech Pieprzyca.
Zaawansowane metody programowania – Wykład V
Static, const, volatile.
OOPC++ - wstêp, klasy1 Klasy Do struktury można dołączyć operacje działające na jej polach. struct date { int day, month, year; void set (int d, int m,
Struktury.
C++ wykład 2 ( ) Klasy i obiekty.
Zasady zaliczenia Warunki uzyskania zaliczenia:
Wstęp do programowania obiektowego
Projektowanie i programowanie obiektowe II - Wykład IV
Projektowanie i programowanie obiektowe II - Wykład II
Programowanie obiektowe W1 Wprowadzenie
Klasy w C++. Deklaracja klasy class NazwaTwojejKlasy { //w tym miejscu piszemy definicje typów, //zmienne i funkcje jakie mają należeć do klasy. }; //tutaj.
Podstawy informatyki 2013/2014
Podstawy informatyki 2013/2014
Podstawy informatyki 2013/2014 Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
Podstawy informatyki 2013/2014
Podstawy informatyki 2013/2014
Podstawy informatyki 2013/2014 Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
Podstawy informatyki 2012/2013
Podstawy programowania II
T: Różnice pomiędzy programowaniem strukturalnym a obiektowym
Źródła: podręcznikopracował: A. Jędryczkowski.
Programowanie strukturalne i obiektowe
Jakub Wołczko W obiektowym świecie… Jakub Wołczko
WPROWADZENIE W ŚWIAT OBIEKTÓW
Java – coś na temat Klas Piotr Rosik
Dziedziczenie Maciek Mięczakowski
Programowanie obiektowe Wykład 7 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/20 Dariusz Wardowski.
Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Dariusz Wardowski.
Podstawy informatyki 2013/2014
Podstawy informatyki 2013/2014 Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
Programowanie obiektowe – język C++
Programowanie obiektowe 2013/2014 Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
Programowanie obiektowe 2013/2014
ZWIĄZKI MIĘDZY KLASAMI KLASY ABSTRAKCYJNE OGRANICZENIA INTERFEJSY SZABLONY safa Michał Telus.
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ć.
Programowanie w języku C++
Programowanie strukturalne i obiektowe C++
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski informatyka +
Programowanie strukturalne i obiektowe C++
Programowanie strukturalne i obiektowe C++
Model obiektowy bazy danych
Diagram klas Kluczowymi elementami są: klasy (class)
Programowanie strukturalne i obiektowe C++ Przeładowanie operatorów Robert Nowak.
K URS JĘZYKA C++ – WYKŁAD 2 ( ) Klasy i obiekty.
K URS JĘZYKA C++ – WYKŁAD 6 ( ) Polimorfizm.
Programowanie obiektowe
Projektowanie obiektowe. Przykład: Punktem wyjścia w obiektowym tworzeniu systemu informacyjnego jest zawsze pewien model biznesowy. Przykład: Diagram.
Programowanie Zaawansowane
Podstawy informatyki Tablice Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
Podstawy informatyki Preprocesor Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
Podstawy informatyki Funkcje Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego Matuszyka Podstawy.
Podstawy informatyki Struktury Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
Podstawy informatyki Szablony funkcji Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty.
Podstawy informatyki Operatory rzutowania Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały.
Podstawy informatyki Mechanizm obsługi sytuacji wyjątkowych Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu.
K URS JĘZYKA C++ – WYKŁAD 3 ( ) Przenoszenie Składowe statyczne Funkcje wbudowane Argumenty domyślne.
Programowanie Obiektowe – Wykład 6
Klasy, pola, obiekty, metody. Modyfikatory dostępu, hermetyzacja
Programowanie Obiektowe – Wykład 2
Język C++ Typy Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego.
PGO - Projektowanie i implementacja pierwszych klas
Zapis prezentacji:

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

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.

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

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.

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.

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.

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.

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.

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

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!

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

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

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.

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

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; }

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

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

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

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; }

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; }

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;

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!

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

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

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.

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

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; }

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.

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

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

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.

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.

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.

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.

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 };

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.

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 };

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

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

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;}

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!

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: http://creativecommons.org/licenses/by-sa/3.0/deed.pl