JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM Wykład 9 1
Ogłoszenia 17 stycznia 2017 planowany jest termin 0 egzaminu. o Do terminu 0 mogą przystąpić wszystkie osoby które mają zaliczone sprawozdania zaliczenie z laboratorium nie jest wymagane. o Przed terminem 0 sprawdzam sprawozdania przesłane do 13.01.2017 godz. 12:00 o Obowiązuje (oczywiście) materiał z dotychczasowych wykładów. o Na egzamin należy bezwzględnie przynieść dokument ze zdjęciem. o Wpisy po zaliczenie laboratorium, jednakże z datą nie wcześniejszą niż data 1. terminu egzaminu. 2
Ogłoszenia 17 stycznia 2017 planowany jest termin 0 egzaminu. o Do następnych terminów są dopuszczane osoby posiadające wszystkie zaliczenia cząstkowe. o Na następnych terminach obowiązuje materiał z wszystkich wykładów. o Każdą ocenę pozytywną z egzaminu można poprawić brana pod uwagę jest ocena z poprawy! o Chęć poprawy oceny pozytywnej należy zgłosić (drogą elektroniczną bądź osobiście) najpóźniej 3 dni przed planowanym terminem. 3
OPERACJE NA PLIKACH Biblioteka odpowiedzialna za obsługę plików: fstream o Do działania na plikach niezbędne jest włączenie odpowiedniego pliku nagłówkowego dyrektywą #include <fstream> o o o By móc odczytać coś z pliku bądź do niego coś zapisać należy ten plik otworzyć w odpowiednim trybie, np.: ifstream plik("dane1.dat",ios::in); ofstream plik("dane2.dat",ios::out); Sprawdzenie, czy udało się otworzyć plik: if(plik) {...} Po zakończeniu działania na pliku należy go zamknąć: plik.close(); 4
OPERACJE NA PLIKACH Tryby otwarcia pliku: Tryb ios::in ios::out ios::app ios::ate ios::trunc ios::nocreate ios::noreplace Opis (input) otwórz plik do odczytu (output) otwórz plik do zapisu (utwórz nowy lub wyczyść zawartość już istniejącego) (append) dopisz do końca pliku. Dane mogą być zapisane wyłącznie na końcu pliku (at end) otwórz plik do zapisu i przejdź na koniec pliku. Dane mogą być zapisane gdziekolwiek w pliku. (truncate) jeśli plik istnieje, usuń jego zawartość (jest to także domyślne działanie ios::out) operacja otwarcia nie powiedzie się, jeśli plik nie istnieje operacja otwarcia nie powiedzie się, jeśli plik istnieje 5
OPERACJE NA PLIKACH Przykład: zapis do pliku 6
OPERACJE NA PLIKACH Przykład: zapis do pliku v2 7
OPERACJE NA PLIKACH Przykład: odczyt z pliku 8
PARAMETRY URUCHOMIENIA Dane do programu można przesłać za pomocą parametrów uruchomienia (wywołania). np. uruchamiamy (w konsoli): obliczenia.exe p1 p2 p3 o Aby korzystanie z parametrów wywołania było możliwe, funkcja main programu powinna być zdefiniowana z nagłówkiem: int main(int argc, char **argv) lub: int main(int argc, char *argv[]) o o Pierwszy argument, o zwyczajowej nazwie argc (argument counter), jest liczbą parametrów podanych podczas wywołania programu. Drugi argument, o zwyczajowej nazwie argv (argument vector), to tablica parametrów (tablica wskaźników do ciągów znaków). 9
PARAMETRY URUCHOMIENIA o o o Pierwszym parametrem (o numerze 0) jest nazwa wywoływanego program (zatem liczba parametrów jest zawsze równa co najmniej 1...). Wszystkie parametry wywołania są przesyłane do funkcji main jako C-stringi! Jeśli chcemy przekazać jako pojedynczy parametr napisy zawierające spacje należy je ująć w cudzysłowy. o Zatem jeśli mamy np. program programik.exe to można go wywołać np.: programik.exe 12.5 wyraz "kilka wyrazow jako jeden parametr" o Podczas tworzenia programu: to też jest napis! - Code::Blocks: Project / Set programs arguments - DevC++: Uruchom / Parametry... 10
PARAMETRY URUCHOMIENIA Przykład 11
Zaczynamy (nareszcie!) PROGRAMOWANIE ORIENTOWANE OBIEKTOWO programowanie zorientowane obiektowo programowanie obiektowe (Object Oriented Programming, OOP) 12
KLASY I OBIEKTY Czym jest obiekt? 13
KLASY I OBIEKTY Własne typy danych - wprowadzenie o Pewne typy danych, jak int, float, double czy char są wbudowane w język C++. Pozwalają na tworzenie zmiennych (obiektów) tych typów. o W języku C++ można tworzyć własne typy danych w postaci klas i struktur. Na ich bazie można tworzyć obiekty własnych typów. o Własne typy (klasy) umożliwiają powiązanie danych z funkcjami - znaczy to, że kompilator nie dopuści do tego, by do funkcji oczekującej argumentu typu temperatura wysłać argument typu konto_bankowe... o Klasa to plany budowy obiektów danej klasy. By z nich skorzystać, należy stworzyć przynajmniej jeden obiekt danej klasy. o Obiektem może być w zasadzie dowolna rzecz. Programista wykorzystuje obiekty jako elementy składowe programu. 14
KLASY I OBIEKTY Własne typy danych - wprowadzenie o Np. można stworzyć klasę Samochod. Klasę tą opisuje: o zestaw wartości (dane składowe), np.: marka, kolor, silnik, masa, predkosc. o zestaw możliwych zachowań (funkcje składowe), np.: przyspiesz, hamuj, skrec, cofaj. o Elementami składowymi klasy mogą być nie tylko zmienne typów wbudowanych, ale też obiekty innych klas (obiekty składowe), np. elementami klasy Komputer mogą być obiekty klas: Obudowa, Plyta_glowna, Grafika, Pamiec itp. 15
KLASY I OBIEKTY Potrafi (funkcje): Klasa Pies - oddychać - szczekać - biegać -... Ma cechy (dane): - imię? - wiek? - waga? A oto konkretne egzemplarze (obiekty) klasy Pies: -... Bajka 5 miesięcy 10 kg Astra 2 lata 20 kg 16
KLASY I OBIEKTY Własne typy danych - wprowadzenie o Wszystkie elementy (dane składowe i funkcje składowe) są znane w całej klasie (nazwy deklarowane w klasie mają obszar ważności całej klasy). o Dotychczas (w programowaniu strukturalnym) zmienna np. wewnątrz funkcji była znana od momentu definicji tej zmiennej do końca tej funkcji. o Istota programowania obiektowego polega na umiejętnym wymyślaniu typów (klas) oraz na ponownym używaniu typów (klas) już wcześniej zdefiniowanych 17
KLASY I OBIEKTY Definiowanie klas: Klasę definiuje się za pomocą słowa kluczowego class po którym następuje jej nazwa: class Rower // definicja klasy Rower { //... // ciało klasy }; // obowiązkowo średnik na końcu! Obiekty danej klasy tworzy się podając nazwę klasy i nazwę obiektu: Rower goral; // stworzenie obiektu klasy Rower czyli analogicznie, jak dla typów wbudowanych: int zmienna; // stworzenie obiektu (zmiennej) typu int Sama deklaracja klasy: class Rower; // deklaracja klasy Rower (średnik na końcu) 18
KLASY I OBIEKTY Przykład: 19
KLASY I OBIEKTY Można też tworzyć referencje oraz wskaźniki do takich obiektów. Np. rozbudowując funkcję main() w programie z poprzedniego slajdu: Referencja: Samochod &autko=wymarzony; // definiujemy referencję autko.wlacz_silnik(); // i korzystamy z niej... cout<<"uruchomilem silnik samochodu "<<autko.model<<endl; Do składnika klasy w przypadku referencji odnosimy się tak samo, jak za pomocą nazwy tego obiektu (wszak referencja to inna nazwa tego samego obiektu...), czyli za pomocą operatora w postaci kropki. Po co? Np. przesyłanie obiektów do funkcji... Wskaźnik: Samochod *wsk=&wymarzony; // tworzymy wskaźnik i ustawiamy go wsk->wlacz_silnik(); // korzystamy ze wskaźnika - zauważ -> cout<<"uruchomilem silnik samochodu "<<wsk->model<<endl; Do składnika klasy w przypadku wskaźnika odnosimy się za pomocą operatora w postaci ->. 20
SŁOWNICTWO OBIEKTOWE o Programowanie zorientowane obiektowo (ang. object-oriented programming), OOP metodyka tworzenia programów komputerowych, która definiuje programy za pomocą obiektów, czyli elementów łączących stan (dane) i zachowanie (funkcje). o Program obiektowy program komputerowy wyrażony jako zbiór obiektów komunikujących się pomiędzy sobą w celu wykonywania zadań. o Klasa to typ danych tworzony przez programistę. Klasa to typ obiektu, a nie sam obiekt. o Interfejs klasy funkcje składowe klasy, które są dostępne dla użytkowników tej klasy. Funkcje te są dostępne z każdego miejsca w programie i mają pełny dostęp do wszystkich danych składowych klas. Za pomocą tych funkcji możliwe są wszelkie interakcje między obiektami klas. o Obiekt egzemplarz typu zdefiniowanego przez użytkownika, podobnie jak egzemplarz typu wbudowanego w język (np. int) zwany jest zmienną. 21
SŁOWNICTWO OBIEKTOWE o Enkapsulacja (zamknięcie w kapsule) definicja klasy sprawia, że dane składowe i funkcje składowe nie są rozmieszczone luźno w programie, tylko obudowane klasą. W momencie definicji pojedynczego egzemplarza obiektu danej klasy dostaje się realizację takiej kapsuły, ze wszystkimi danymi (atrybutami) i funkcjami (zachowaniami) obiektu. o Hermetyzacja (ukrywanie informacji) klasa powinna udostępniać na zewnątrz tylko te elementy, których dostępność jest niezbędna. W szczególności dobrym nawykiem jest uniemożliwienie bezpośredniego dostępu do danych składowych. Dostęp do nich powinny zapewniać stosowne funkcje (tzw. funkcje dostępowe). 22
KLASY I OBIEKTY Do określania dostępu do składowych klasy służą etykiety: o Etykieta private oznacza, że dane i funkcje deklarowane za nią są dostępne tylko wewnątrz klasy (zatem do danych prywatnych klasy mają dostęp tylko funkcje składowe tej klasy). o Etykieta public oznacza, że dane i funkcje deklarowane za nią są dostępne zarówno z wnętrza klasy, jak i spoza klasy. o Etykieta protected składniki określone w ten sposób są dostępne tak, jak składniki prywatne, ale są również dostępne dla klas wywodzących się od danej klasy (o tym przy innej okazji...). Kolejność etykiet nie ma znaczenia, ale często przyjmuje się następującą kolejność składników klasy (szczególnie w dużych projektach): 1. public (jako najbardziej interesujące dla użytkownika klasy); 2. protected; 3. private (jako istotne wyłącznie dla programisty tworzącego daną klasę). 23
KLASY I OBIEKTY Domyślnie (dopóki nie wystąpi żadna etykieta) wszystkie składniki klasy są prywatne. class Przykladowa_klasa { int liczba_elementow; // dane składowe prywatne (przez domniemanie) float policz(float a, float b); public: int zwroc_liczbe_elementow(); // deklaracja (tylko) void modyfikuj_liczbe elementow(); // publicznych funkcji składowych protected: double pomoc; // jakaś dana protected private: int c; double d; // kolejne dane prywatne... }; // średnik! 24
KLASY I OBIEKTY class Pralka // definicja klasy Pralka { public: void pranie(int program,int temperatura); // ogólnodostępne funkcje void wirowanie(int obroty); // składowe klasy void plukanie(); bool start_stop(); private: int nr_programu; // dane składowe klasy int temperatura_prania; int obroty_minute; string nazwa_pralki; Zegar czas; Silnik krokowy; // obiekty innych klas void pranie_wstepne(); // funkcje prywatne klasy void pranie_zasadnicze(); friend void serwis(pralka &marka_pralki); // funkcje zaprzyjaźnione friend void dane_techniczne(pralka *marka); // z daną klasą }; //------------------------------------ main() { //... Pralka Whirlpool, Bosch, Polar; //definicja 3 obiektów klasy Pralka //... } 25
KLASY vs. STRUKTURY Wielu programistów wyraźnie rozróżnia między "klasą" a "strukturą". "Struktura" jest jak sterta bitów nie poddana w ogóle (lub w niewielkim stopniu) enkapsulacji i powiązaniu z funkcjami. "Klasa" natomiast jest jak żywy i odpowiedzialny członek społeczeństwa, świadczący reszcie pewne usługi, otoczony barierą enkapsulacji i oferujący dobrze zaprojektowany interfejs. Ponieważ jest to dość powszechnie występująca konotacja, powinieneś (powinnaś) używać słowa kluczowego struct raczej tylko wtedy, gdy potrzebujesz klasy dysponującej niewielką ilością metod w przeciwnym wypadku użyj słowa class. http://klub.chip.pl/b.krzemien/c++-faq-pl/classes-and-objects.html#faq-7.8 Jedyna różnica między klasami i strukturami w C++: W klasie wszystkie dane i funkcje są domyślnie prywatne, podczas gdy w strukturze są one domyślnie publiczne. Zatem po co istnieją jednocześnie struktury oraz klasy? Struktury istniały już w C, ich pozostawienie wynikało z konieczności zachowania kompatybilności kodu... 26
KLASY I OBIEKTY o Definicja klasy nie skutkuje rezerwacją pamięci (w końcu klasa to tylko typ obiektu...). Dopiero definicja obiektu rezerwuje miejsce w pamięci na ten obiekt. o By przekonać się, ile miejsca w pamięci zajmuje obiekt danej klasy: lub: cout<<sizeof(whirlpool); cout<<sizeof(pralka); //nie musi istnieć żaden obiekt danej klasy! o Dla każdego obiektu danej klasy tworzony jest osobny zestaw danych składowych. o Natomiast funkcje składowe są w pamięci jednokrotnie dla wszystkich obiektów danej klasy. o Funkcje składowe mają pełny dostęp do wszystkich składników swojej klasy, tj. do danych (mogą z nich korzystać i je modyfikować) i do innych funkcji składowych (mogą je wywoływać). o Funkcje składowe wywołuje się na rzecz konkretnego obiektu klasy, np.: Wymarzony.wlacz_silnik(); (zauważ kropkę...) 27
KLASY I OBIEKTY Przykład: 28