Języki i paradygmaty programowania WYDZIAŁ ELEKTRONIKI i INFORMATYKI dr inż. Robert Arsoba Politechnika Koszalińska Wydział Elektroniki i Informatyki POLITECHNIKA KOSZALIŃSKA 2009/2010
Materiały do wykładu i ćwiczeń http://moskit.ie.tu.koszalin.pl/~bobby
Literatura Podstawy C i programowanie obiektowe w C++ 1. J. Grębosz: Symfonia C++. Programowanie w języku C++ orientowane obiektowo, Oficyna Kallimach, Kraków, 1999. 2. K. Barteczko: Praktyczne wprowadzenie do programowania obiektowego w języku C++, Wyd. Lupus, Warszawa 1993. 3. B. Stroustrup: Język C++, WNT, Warszawa, 2000. 4. S. Lippman: Podstawy języka C++, WNT, Warszawa, 1997. 5. S. Lippman, J. Lajoie: Podstawy języka C++, WNT, Warszawa 2001. 6. B. Eckel: Thinking in C++. Edycja polska, Wyd. Helion, Gliwice 2002.
Literatura Programowanie obiektowe w C++ 1. C. Delannoy: Ćwiczenia z języka C++. Programowanie obiektowe, WNT, Warszawa 1993. 2. E. Kain: Od C do C++, Wyd. Helion, Gliwice 1993. 3. P. Metzger: C++. Pierwsze kroki, Wyd. Helion, Gliwice 1994. 4. J. Grębosz: Pasja C++. Szablony, pojemniki i obsługa sytuacji wyjątkowych w języku C++, Oficyna Kallimach, Kraków, 1999.
Literatura Programowanie w środowisku Windows 1. I. Horton: Visual C++ 2005. Od podstaw, Wyd. Helion, Gliwice 2007 (ANSI C++, MFC, C++/CLI dla.net) 2. M. Owczarek: Aplikacje w Visual C++ 2005. Przykłady, Wyd. Helion, Gliwice 2007 (C++/CLI dla.net) 3. P. Besta: Visual Studio 2005. Programowanie z Windows API w C++, Wyd. Helion, Gliwice 2008 4. Ch. Petzold: Programowanie Windows, Oficyna Wydawnicza Read Me, Warszawa 1999 (dotyczy Windows API). 5. J. Hollingworth: C++ Builder 6. Vademecum profesjonalisty. Wyd. Helion, Gliwice 2003
Środowiska programistyczne IDE (Integrated Development Environment) Dev-C++ Eclipse licencje publiczne Visual Studio C++ (Microsoft) Express Edition C++ Builder (Embarcadero) RAD (Rapid Application Development) szybkie tworzenie aplikacji
Tematyka wykładów 1. Wprowadzenie. Klasy cz. 1 - Język C++. Programowanie obiektowe - Klasy i obiekty - Budowa i deklaracja klasy. Prawa dostępu - Pola i funkcje składowe - Konstruktor i destruktor - Tworzenie obiektów 2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne 3. Funkcje operatorowe. Wskaźnik this 4. Dziedziczenie 5. Polimorfizm i funkcje wirtualne 6. Szablony 7. Strumienie 8. Tworzenie aplikacji w systemie Windows
Wprowadzenie Język C a C++ Rozszerzenia nieobiektowe języka C++ Programowanie strukturalne a obiektowe Co to jest programowanie obiektowe?
Języki programowania Niskiego poziomu Wysokiego poziomu asembler Lisp Forth SPECJALIZOWANE SQL Prolog STRUKTURALNE Pascal C Modula Visual Basic SKRYPTOWE Perl OBIEKTOWE C++ Java C# Object Pascal Smalltalk Eiffel JavaScript PHP Ruby Python
Języki C i C++ Język C Rozszerzenia nieobiektowe Rozszerzenia obiektowe Język C++
Rozszerzenia nieobiektowe C++ Nowe mechanizmy WE/WY: strumienie cout, cin Nowy symbol komentarzy: // (komentarz wierszowy) Dowolne rozmieszczenie deklaracji Wyrażenia arytmetyczne w inicjalizacji: int a = 2*n-1; Przekazywanie argumentów do funkcji przez referencję void zwieksz(int &a) a++; } Argumenty domniemane funkcji void ustaw(int x, int y = 2, int z = 4) Przeciążanie funkcji Dynamiczne zarządzanie pamięcią: Funkcje otwarte inline new, delete
Programowanie strukturalne Program dzielony jest na fragmenty (podprogramy) nazywane procedurami lub funkcjami. Modularne Moduł to zestaw podprogramów. Programowanie obiektowe Dane i przetwarzające je funkcje tworzą całość (tzw. klasę). TYP DANYCH ZMIENNA KLASA OBIEKT Komponentowe Komponent to zestaw klas.
Programowanie obiektowe Programowanie obiektowe jest metodą projektowania i implementowania systemów informatycznych polegającą na modelowaniu obiektów rzeczywistych przy użyciu obiektów programowych. x, y Plik Edycja Widok Wstaw Format Pomoc h = 90 w = 120 class Okno private: int x, y, h, w; public: Okno(int szer, int wys) x = y = 0; h = wys; w = szer; } void Otworz()... } void Zamknij()... } void Przesun(int dx, int dy)... } };
Programowanie obiektowe (PO) PO nie daje żadnych nowych efektów w gotowym programie Zastosowanie PO nie jest widoczne dla użytkownika programu PO nie jest związane z żadnym językiem programowania
Cel programowania obiektowego Celem programowania obiektowego jest ograniczenie problemu złożoności programowania poprzez hermetyzację danych oraz wiązanie obiektów w hierarchiczne struktury. Programowanie obiektowe
Przykład wersja strukturalna #include <iostream> using namespace std; // definicja struktury typedef struct zespolone float re, im; // pola struktury } Zespolone; // dodawanie liczb zespolonych Zespolone dodaj (Zespolone a, Zespolone b) Zespolone c; c.re = a.re + b.re; c.im = a.im + b.im; return c; } void main() Zespolone a = 0, 1}, b = 1, 0}, c; c = dodaj(a, b); cout << "c = "<< c.re << " + j" << c.im << endl; }
Przykład wersja obiektowa #include <iostream> using namespace std; class Zespolone // definicja klasy Zespolone public: Zespolone() re = 0; im = 0; } Zespolone (float Re, float Im) re = Re; im = Im; } }; Zespolone dodaj (Zespolone z) return Zespolone(re+z.re, im+z.im); } void drukuj() cout << re << + j << im; } private: float re, im; // pola klasy void main() Zespolone a(0, 1), b(1, 0), c; c = a.dodaj(b); c.drukuj(); }
Klasy cz.1 Budowa klasy Klasa grupuje: dane (atrybuty, cechy opisujące obiekt) funkcje (czynności wykonywane przez obiekt, metody przetwarzania danych) Składowymi klasy mogą być zatem: zmienne (pola składowe klasy) funkcje (funkcje składowe klasy, metody)
Deklaracja klasy Klasa jest opisem (programowym modelem) rzeczywistego obiektu. Klasa definiuje obiektowy typ danych oraz związane z nim operacje. Deklarowanie klasy: class <nazwa_klasy> <deklaracje pól składowych klasy> <deklaracje funkcji składowych klasy> };
Prawa dostępu Klasa podzielona jest na sekcje oznaczone kwalifikatorami: public, private, protected Kwalifikatory służą do określania praw dostępu do składowych klasy. Składowe publiczne (public) są dostępne wewnątrz klasy i wszędzie poza klasą (również w innych klasach). Składowe prywatne (private) są dostępne tylko wewnątrz danej klasy na zewnątrz klasy są niedostępne. Składowe chronione / zabezpieczone (protected) są dostępne wewnątrz klasy i w klasach pochodnych. Jeżeli kwalifikator nie jest podany, domyślnie przyjmuje się prawa dostępu private.
Pola Pola składowe klasy (krótko: pola) to zmienne zadeklarowane wewnątrz klasy. Deklaracja pola ma postać deklaracji zmiennej. PRZYKŁADY: int wspx, wspy; float z; bool start; static int FONT_SIZE; char ulica[20]; Zespolone z; Punkt p;
Funkcje składowe (metody) Definicja funkcji składowej klasy: <typ> <nazwa klasy>::<nazwa_funkcji> (<argumenty>) <deklaracje> CIAŁO FUNKCJI (TREŚĆ) <instrukcje> }
Funkcje składowe (metody) class Punkt public: definicja w ciele klasy void Rysuj() /* rysowanie */ } }; class Punkt public: void Rysuj(); }; void Punkt::Rysuj() /* rysowanie */ } definicja poza ciałem klasy
Przykład deklaracji klasy kwalifikatory praw dostępu class Punkt private: int x, y; pola składowe funkcje składowe public: // konstruktor bezparametrowy Punkt() x = y = 0; } // konstruktor z parametrami Punkt(int a, int b) x = a; y = b; } }; void Rysuj() /* rysowanie */ }
Wywołanie funkcji składowej Funkcja składowa klasy może być aktywowana (wywołana) tylko na rzecz obiektu tej samej klasy. <nazwa obiektu>.<nazwa_funkcji> (<argumenty>) ; PRZYKŁAD: Punkt p; p.rysuj();
Konstruktor Konstruktor to specjalna funkcja składowa klasy, odpowiedzialna za tworzenie obiektu. Zadaniem konstruktora jest również wykonanie różnych czynności związanych z powstaniem obiektu, przewidzianych przez programistę (np. nadanie odpowiednich wartości polom składowym). Cechy konstruktora: każda klasa musi zawierać konstruktor (patrz: domyślny) nazwa identyczna z nazwą klasy uruchamiany automatycznie w momencie tworzenia obiektu nie można go aktywować na rzecz obiektu nie zwraca wyniku, nie ma typu wyniku argumentami nie mogą być obiekty tej samej klasy przekazane przez wartość (mogą być, ale przekazane przez referencję) możliwość przeciążania (w klasie może być kilka konstruktorów) powinien być funkcją publiczną (prywatny jest bezużyteczny)
PRZYKŁAD: class Punkt private: int x, y; Konstruktor public: Punkt() // konstruktor bezparametrowy x = y = 0; } Punkt(int a, int b) // konstruktor x = a; y = b; } // z 2 parametrami Punkt(int a); // konstruktor }; // z 1 parametrem Punkt::Punkt(int a) x = a; y = 0; }
Konstruktor Pola składowe klasy będące referencjami lub obiektami, albo poprzedzone słowem kluczowym const mogą być inicjalizowane tylko za pomocą listy inicjalizującej. class Kolo private: int promien; Punkt srodek; const float PI; obiekt stała }; public: Kolo(int r, Punkt p, float x); Kolo::Kolo(int r, Punkt p, float x) : srodek(p), PI(x) promien = r; }
Destruktor Destruktor to specjalna funkcja składowa klasy, odpowiedzialna za niszczenie obiektu. Zadaniem destruktora jest również wykonanie różnych czynności związanych z usuwaniem obiektu, przewidzianych przez programistę (np. zwolnienie obszarów pamięci przydzielanych dynamicznie). Cechy destruktora: każda klasa musi zawierać destruktor (patrz: domyślny) nazwa identyczna z nazwą klasy, poprzedzona znakiem ~ uruchamiany automatycznie w momencie niszczenia obiektu można go aktywować na rzecz obiektu podając pełną nazwę kwalifikowaną nie zwraca wyniku, nie ma typu wyniku brak argumentów brak możliwości przeciążania (w klasie może być tylko jeden destruktor)
Destruktor PRZYKŁAD: class Punkt private: int x, y; public: Punkt() // konstruktor bezparametrowy x = y = 0; } ~Punkt() // destruktor } }; Punkt::~Punkt() }
Tworzenie obiektów Klasa to obiektowy typ danych. Obiekt to zmienna typu obiektowego (egzemplarz klasy, instancja klasy). DEKLARACJA I STATYCZNE UTWORZENIE OBIEKTU: Punkt p1, p2(2, 3); DYNAMICZNE UTWORZENIE OBIEKTU: Punkt *p3, *p4; p3 = new Punkt(); p4 = new Punkt(2, 3); WYWOŁANIE FUNKCJI SKŁADOWEJ NA RZECZ OBIEKTU: p1.rysuj(); p3->rysuj(); (*p3).rysuj();