Wstęp do programowania obiektowego

Podobne dokumenty
Programowanie w C++ Wykład 12. Katarzyna Grzelak. 20 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 32

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26

Wstęp do programowania obiektowego. Przekazywanie parametrów do funkcji w C++ Metody i funkcje operatorowe Strumienie: standardowe, plikowe, napisowe

Dziedziczenie & W slajdach są materiały zapożyczone z

Programowanie obiektowe

Język C++ wykład VIII

Operacje wejścia/wyjścia (odsłona druga) - pliki

PARADYGMATY PROGRAMOWANIA Wykład 4

Dziedziczenie jednobazowe, poliformizm

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

Programowanie 2. Język C++. Wykład 3.

Wejście wyjście strumieniowe

Referencje. Zasady zaliczeń. Zasady zaliczeń. Zasady zaliczeń. Zasady zaliczeń. Zaawansowane Programowanie Obiektowe. Informacje organizacyjne:

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

Programowanie obiektowe w języku

dr inż. Jarosław Forenc

Programowanie 2. Język C++. Wykład 9.

Język C++ Różnice między C a C++

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

Wykład V. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Pliki wykład 2. Dorota Pylak

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 21 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 24

Wykład :37 PP2_W9

Podstawy Programowania Obiektowego

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

TEMAT : KLASY DZIEDZICZENIE

Język C++ wykład VI. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VI. dr Jarosław Mederski.

Programowanie obiektowe w języku C++ Zarządzanie procesami. dr inż. Jarosław Forenc. Przeładowanie (przeciążanie) operatorów

Pliki wykład 2 -przekazywanie strumieni do funkcji -funkcje get(char &) i getline(string)

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Dziedziczenie. Ogólna postać dziedziczenia klas:

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Programowanie w językach

Programowanie Obiektowe i C++

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

Pliki wykład 2. Dorota Pylak

Zaawansowane programowanie w języku C++ Programowanie obiektowe

jest mocny, skoro da się w nim wyrazić nowe pojęcia; łatwiej przenieść go na nową platformę jest mniejszy.

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

PARADYGMATY PROGRAMOWANIA Wykład 2

Nowe słowa kluczowe. Komentarze. Wskaźniki typu void. class, delete, new, friend,... /* Komentarz w C i C++ */ // Komentarz w C++ (do końca wiersza)

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Wykład 2 Operacje wejściawyjścia. Ewa Gajda

Wykład 8: klasy cz. 4

Programowanie Obiektowe i C++

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Rzutowanie i konwersje

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Podstawy programowania w języku C++ Zadania - dziedziczenie i polimorfizm

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

PROGRAMOWANIE OBIEKTOWE W C++ cz. 2. Dziedziczenie, operacje wej cia-wyj cia, przeładowanie operatorów.

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Technologie cyfrowe semestr letni 2018/2019

2.4 Dziedziczenie. 2.4 Dziedziczenie Przykłady programowania w C - kurs podstawowy

Mechanizm dziedziczenia

Programowanie obiektowe, wykład nr 7. Przegląd typów strukturalnych - klasy i obiekty - c.d.

Funkcje przeciążone, konstruktory kopiujące, argumenty domyślne

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Język C++ zajęcia nr 1

Język C++ Programowanie obiektowe

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

C++ - [4-7] Polimorfizm

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Część 4 życie programu

Programowanie obiektowe w C++ Wykład 12

KLASY cz.1. Dorota Pylak

Programowanie obiektowe w C++ Wykład 1

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Prof. Danuta Makowiec Instytut Fizyki Teoretycznej i Astrofizyki pok. 353, tel danuta.makowiec at gmail.com

Do czego służą klasy?

Spis treści OBSŁUGA PLIKÓW W JĘZYKU C++ Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF32

Do czego służą klasy?

Zajęcia nr 4 Programowanie obiektowe konstruktory. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

EGZAMIN 2 (14 WRZEŚNIA 2015) JĘZYK C++

PROE wykład 4 pozostałe operatory, forward declaration, dziedziczenie. dr inż. Jacek Naruniec

Operacje wejścia/wyjścia odsłona pierwsza

Wstęp do Programowania 2

Pliki wykład. Dorota Pylak

Programowanie Obiektowo Zorientowane w języku C++ Klasy, pola, metody

Wykład 1. Program przedmiotu. Programowanie (język C++) Literatura. Program przedmiotu c.d.:

Programowanie Obiektowe i C++

Typy zmiennych proste i złożone. Programowanie komputerów. Tablica. Złożone typy zmiennych. Klasa. Struktura

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

Szablony klas, zastosowanie szablonów w programach

Programowanie, część I

Transkrypt:

Wstęp do programowania obiektowego KLASA ISTREAM KLASA OSTREAM MANIPULATORY STRUMIENIOWE STRUKTURY W C++ DOMYŚLNE WARTOŚCI PARAMETRÓW KONSTRUKTORY I DESTRUKTORY KLAS POCHODNYCH KONSTRUKTOR KOPIUJĄCY POLIMORFIZM 1

KLASA ISTREAM 2

Obiekty klasy istream mogą czytać i interpretować sekwencję znaków. Z tej klasy dziedziczą: iostream (strumień uniwersalny), ifstream (wejście z pliku) istringstream (wejście z napisu). 3

Wybrane metody klasy istream int get(); // czyta pojedynczy znak int peek(); // podgląd następnego znaku istream& putback(char c); // zwraca znak do strum. istream& ignore(int n=1); // opuszcza n znaków istream& getline (char* s, streamsize n ); istream& getline (char* s, streamsize n, char delim ); // czyta znaki ze strumienia (maksymalnie n) dopóki nie napotka na delimiter (domyślnie '\n') 4

Przykład użycia get, peek, ignore int kod; if (cin.peek() == @ ) // jeżeli następny znak to @ cin.ignore(); // opuść go, else kod = cin.get(); // wczytaj znak 5

Przykład z putback i getline cout << "Please, enter a number or a word: "; char c = cin.get(); if ( (c >= '0') && (c <= '9') ) { int n; cin.putback (c); cin >> n; cout << "You entered a number: " << n << '\n'; } else { string str; cin.putback (c); getline (cin,str); cout << "You entered a word: " << str << '\n'; } 6

KLASA OSTREAM 7

Obiekty klasy ostream mogą pisać sekwencję znaków. Z tej klasy dziedziczą: iostream (strumień uniwersalny), ofstream (wyjście do pliku) ostringstream (wyjście do napisu). 8

Wybrane metody klasy ostream int put(); //wyprowadza znak ostream& write ( const char* s, streamsize n ); //wyprowadza n znaków z s (tablica char[]) 9

Przykład: maszyna do pisania #include <iostream> #include <fstream> // std::cin, std::cout // std::ofstream int main () { std::ofstream outfile ("test.txt"); char ch; } std::cout << "Type some text (type a dot to finish):\n"; do { ch = std::cin.get(); outfile.put(ch); } while (ch!='.'); return 0; // wszystko co pisze użytkownik zapisuje do pliku test.txt 10

PRZYKŁAD: KOPIOWANIE PLIKU ZNAK PO ZNAKU main() { ifstream we( TEST1.TXT ); ofstream wy( TEST2.TXT ); if (!we!wy) { cerr << Błąd otwarcia pliku ; return 1; } char zn; while (we.get(zn) && wy.put(zn)); } 11

MANIPULATORY STRUMIENIOWE 12

MANIPULATORY STRUMIENIOWE Manipulatory, to funkcje zmieniające stan strumienia Większość zdefiniowana jest w pliku nagłówkowym <iomanip.h>. Można również definiować własne manipulatory. Częściej używane to: endl - przejście do nowego wiersza ends - dodanie znaku \0 do strumienia dec - postać dziesiętna liczby hex - postać szesnastkowa liczby oct - postać ósemkowa liczby flush - opróżnienie bufora strumienia setw(int w) - ustawienie szerokości pola setprecision(int p) - ustawienie liczby miejsc po przecinku setfill(int c) - określenie znaku wypełniającego 13

Przykłady użycia manipulatorów int n= 255; cout << hex << n << endl; // wypisuje liczbę szesnastkową double a=1.2355, b=2.5, c=3.14; cout << setprecision(2) << fixed << a << '\t' << b << '\t' << c << endl; // wypisuje liczby 2 znakami po przecinku, rozdzielone tabulacją cout << scientific << a << '\t' << b << '\t' << c << endl; // wypisuje liczby w formacie wykładniczym, precyzja jak przedtem 14

STRUKTURY W C++ 15

Struktury w C++ są deklarowane tak jak w C, jednak oprócz pól mogą zawierać także funkcje (tzw. metody) i mogą dziedziczyć z innych klas i struktur. Struktura różni się w C++ od klasy wyłącznie domyślnym zakresem widoczności jej pól i metod - dla klasy jest to private a dla struktur public. Używanie struktur zamiast klas nie jest dobrą praktyką programowania, gdyż utrudnia czytanie programu. 16

Przykład struktury w C++ struct miasto { long ludnosc; char* rzeka; miasto(long ll,char *rz): ludnosc(ll), rzeka(strdup(rz)) {}; inline char* get_rzeka() {return rzeka}; ~miasto() { free((void*)rzeka); } }; 17

DOMYŚLNE WARTOŚCI PARAMETRÓW 18

Domyślne wartości parametrów W C++ można zdefiniować domyślne wartości parametru/ów. W tym celu w nagłówku funkcji/metody/konstruktora na parametrze formalnym wykonujemy podstawienie. Parametry domyślne muszą występować na końcu listy argumentów. W wywołaniu możemy opuścić jedną lub więcej wartość parametru aktualnego, dla której zdefiniowano domyślną wartość 19

Przykład domyślnych wartości parametrów class Punkt { float x,y; public: Punkt(float xx = 5, float yy=7):x(xx), y(yy) { } }; Punkt p1(1,3), p2(8), p3; 20

KONSTRUKTORY I DESTRUKTORY KLAS POCHODNYCH 21

Konstruktory i destruktory klas pochodnych Konstruktory nie są dziedziczone. Jeśli w klasie nie zdefiniowaliśmy konstruktora, to zostanie użyty konstruktor domyślny. Aby powstał obiekt klasy pochodnej, musi być najpierw utworzony podobiekt klasy nadrzędnej wchodzący w jego skład. 22

Standardowo wywoływany jest konstruktor bezparametrowy (lub domyślny) klasy nadrzędnej. Aby do konstrukcji podobiektu klasy bazowej użyć konstruktora innego niż bezparametrowy musimy w klasie pochodnej zdefiniować konstruktor, który wywoła odpowiedni konstruktor klasy bazowej poprzez listę inicjalizacyjną 23

Przykład takiego wywołania class Point { protected: int x; int y; Point(int x, int y) : x(x), y(y) { } }; class Pixel: public Point { public: int color; Pixel(int x, int y, int color) : Punkt(x,y), color(color) { } }; 24

Składowe odziedziczone są tu inicjowane w swojej bazowej klasie (przekazywane jako parametr), składowe nowe w klasie pochodnej. Konstruktory wywoływane są od góry struktury dziedziczenia. Takie łańcuchy wywołań konstruktorów są tworzone dla każdego nowo tworzonego obiektu. Jeśli klasa dziedziczy z kilku klas, to konstruktory klas bazowych są wywoływane w kolejności ich wystąpienia na liście dziedziczenia (problematyczne). 25

Destruktory wywoływane są w kolejności odwrotnej do konstruktorów ( od dołu struktury dziedziczenia). 26

KONSTRUKTOR KOPIUJĄCY 27

Definiowanie własnego konstruktora kopiującego jest niezbędne, gdy klasa zawiera jakieś dane dynamiczne (tworzy obiekty dynamiczne, a nawet zwykłego c-stringa) Podobnie niezbędny jest wtedy destruktor Konstruktor kopiujący przyjmuje jako parametr stały obiekt aktualnej klasy (przekazywany przez stałą referencję) 28

Przykład danych dynamicznych class Osoba { char* imie; public: Osoba() : imie(strcpy(new char[9], "nieznane")) { } Osoba(const char* n) : imie(strcpy(new char[strlen(n)+1], n)) { } Osoba(const Osoba& os) : imie(strcpy(new char[strlen(os. imie)+1], os. imie)) { } ~Osoba() { delete [ ] imie; } }; 29

POLIMORFIZM 30

Polimorfizm Polimorfizm - wskaźniki i referencje mogą dotyczyć obiektów różnego typu, a wywołanie metody dla referencji spowoduje zachowanie odpowiednie dla rzeczywistego 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. Niektóre języki udostępniają bardziej statyczne (w trakcie kompilacji) rozwiązania polimorfizmu - na przykład przeciążanie operatorów i szablony w C++. 31

Typy statyczne i dynamiczne class A { public: void fun() { cout << "Metoda z klasy A"<< endl; } }; class B : public A { void fun() { cout << "Metoda z klasy B"<< endl; } }; A a, *wska = new A, *wskb = new B; A jest obiektem statycznym klasy A. wska jest wskaźnikiem typu A* do obiektu klasy A. Typem statycznym obiektu wskazywanego przez pa jest A i typem dynamicznym również A wskb jest wskaźnikiem typu A* do obiektu klasy B. Typem statycznym obiektu wskazywanego przez wskb jest A, ale typem dynamicznym jego typ prawdziwy, czyli B; 32

Wywołując zwykłą metodę fun() dla obiektów a, *wska, *wskb, decydować będzie typ statyczny obiektu, czyli wywoła się treść z klasy A. Aby wywoływać metodę fun() odpowiednią dla dynamicznego typu obiektu należy w klasie bazowej dodać słówko virtual. Metodę nazywamy wirtualną, a wywołanie polimorficznym. 33

Metoda wirtualna i wywołanie polimorficzne class A { public: virtual void fun() { cout << "Metoda z klasy A"<< endl; } }; class B : public A { void fun() { cout << "Metoda z klasy B"<< endl; } };... A *wskb->fun(); //wypisze "Metoda z klasy B" 34

Warunki wystąpienia polimorfizmu (późnego wiązania) w C++ 1. wywołanie jest poprzez wskaźnik lub referencję typu bazowego (tutaj A*); 2. prawdziwym typem obiektu, na rzecz którego następuje wywołanie, jest typ pochodny (tutaj B); 3. metoda jest wirtualna (virtual); 4. metoda została przedefiniowana w klasie B (ta sama nazwa i sygnatura!). 35

Jawne wywołanie niepolimorficzne funkcji wirtualnej Wywołujemy metodę z klasy bazowej przez nazwę kwalifikowaną: wskb>a::fun(); Nie można jawnie wywoływać polimorficznie: a.b::fun() // błąd! wskb>b::fun(); // błąd! 36

Cena polimorfizmu Ceną za polimorfizm jest pewna utrata wydajności wykonania oraz narzut pamięci. Dla wywołań na rzecz obiektów klas niepolimorficznych odpowiednia metoda jest wybierana (i włączana do kodu wykonywalnego) już w czasie kompilacji na podstawie typu statycznego, jest to tzw. wczesne wiązanie. Późne wiązanie oznacza konieczność sprawdzenia rzeczywistego typu obiektu podczas wykonania programu i wybranie odpowiedniej metody. 37

Inne języki obiektowe W większości języków obiektowych (np. Java, Python) wszystkie wywołania metod są polimorficzne (wirtualne). W C++ mamy możliwość stosowania szybszego i lżejszego pamięciowo statycznego wiązania (kiedy niepotrzebny jest polimorfizm). 38

Polimorfizm i referencje W wywołaniach polimorficznych C++ można używać referencji (analogicznie do wskaźników). A a, *wska = new A, *wskb = new B; A &ref_a = a, &ref_aa = wska, &ref_b = wskb; ref_a.fun(); ref_aa.fun(); ref_b.fun(); //potencjalnie wirtualne 39