Programowanie obiektowe w C++ Wykªad 1 dr Lidia St pie«akademia im. Jana Dªugosza w Cz stochowie L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 1 / 37
Zagadnienia: Klasy, obiekty Dziedziczenie Polimorzm Przeci»anie operatorów Operatory rzutowania Obªuga wyj tków Szablony STL - standardowa biblioteka szablonów Obsªuga wej±cia, wyj±cia oraz plików L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 2 / 37
Literatura Prata Stephen, Szkoªa programowania. J zyk C++. Wydawnictwo Helion, Gliwice 2012 http://www.cplusplus.com Bjarne Stroustrup. J zyk C++. Kompendium wiedzy. Wydawnictwo Helion, Gliwice 2014. Siddhartha Rao. C++. Dla ka»dego. Wydanie VII. Wydawnictwo Helion, Gliwice 2014. Alex Allain. C++. Przewodnik dla pocz tkuj cych. Wydawnictwo Helion, Gliwice 2014. L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 3 / 37
Programowanie proceduralne Problem dzielony jest na mniejsze fragmenty, zwane moduªami. Programista decyduje jakie chce mie funkcje(procedury). Wybiera najlepsze algorytmy. Projektuje struktury do przechowywania danych. L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 4 / 37
Programowanie obiektowe Zdecyduj, jakie chcesz mie klasy; dla ka»dej klasy dostarcz peªny zbiór operacji; korzystaj c z mechanizmu dziedziczenia jawnie wska», co jest wspólne. Cechy j zyka programowania obiektowego: abstrakcyjne typy danych (klasy) hermetyzacja danych (ukrywanie) dziedziczenie polimorzm L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 5 / 37
Hermetyzacja (ang. encapsulation) Kapsuªkowanie, enkapsulacja - ograniczenie dost pno±ci danych i funkcji wewn trznych klas i obiektów, udost pnianie ich jedynie za pomoc specjalnych funkcji nazywanych metodami. Polimorzm Wielopostaciowo± - mo»liwo± istnienia wielu metod o tej samej nazwie, powi zana z mo»liwo±ci wyboru konkretnej metody podczas wykonywania. L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 6 / 37
Dziedziczenie Jedna klasa obiektów mo»e by zdeniowana jako szczególny przypadek innej ogólniejszej klasy, a denicje metod i pól danych klasy ogólniejszej umieszczane s automatycznie w klasie szczególnej. Klasa ogólna nazywana jest klas bazow a klasa szczególna klas pochodn. Klasy pochodne mog deniowa swoje wªasne metody i pola danych, które mog przesªania dziedziczone metody i pola danych. Klasa mo»e dziedziczy wªa±ciwo±ci wi cej ni» jednej klasy - dziedziczenie wielorakie. L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 7 / 37
Programowanie zorientowane obiektowo Klasy Denicja klasy tworzy nowy typ danych. Klasy s opisami obiektów. Obiekty mog przechowywa dane oraz wykonywa okre±lone przez programist zadania. Szkielet denicji klasy: class NazwaKlasy { // tre± klasy }; Na tre± klasy skªadaj si deniowane pola i metody. Pola sªu» do przechowywania danych. Metody sªu» do wykonywania ró»nych operacji na danych. L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 8 / 37
Obiekty w C++ Obiekt: abstrakcyjny byt reprezentuj cy lub opisuj cy pewn rzecz lub poj cie obserwowane w ±wiecie rzeczywistym. Obiekt przechowuje pewne informacje na swój temat (atrybuty). Obiekt charakteryzuje si pewnym zakresem zachowa«. Mo»na poprosi obiekt o wykonanie pewnej operacji na samym sobie. Przykªady: Klasa zmienna; Klasa* wskaznik; wskaznik = new Klasa(argumenty); Klasa* wskaznik = new Klasa(argumenty); L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 9 / 37
Pola klas Pola s skªadowymi klasy, deniowanymi w jej wn trzu (inaczej w ciele klasy). Po utworzeniu zmiennej typu klasowego (obiektu), do jej pól nale»y odwoªywa si za pomoc operatora wyboru skªadowej oznaczanego znakiem kropki '.'. zmienna.pole Po utworzeniu obiektu przy pomocy operatora new, do pól obiektu nale»y odwoªywa si za pomoc operatora wyboru skªadowej, oznaczanego symbolem '->'. wskaznik->pole L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 10 / 37
Metody klas Metody: Operacje wykonywane na obiektach. S wykonywane na skutek wysªania do obiektu komunikatu, który wywoªuje okre±lon metod (operacj ). Metody nosz równie» nazw funkcji skªadowych. Metody deniowane s w ciele klasy. Ka»da metoda mo»e przyjmowa argumenty oraz zwraca wynik. Argumenty metody to dane, które mo»na jej przekaza. Metoda mo»e mie dowoln liczb argumentów (w szczególno±ci 0) umieszczonych w nawiasie okr gªym za jej nazw, oddzielonych przecinkami. Metoda, która nie ma argumentów, ma puste nawiasy okr gªe. Metoda mo»e zwraca wynik przez zastosowanie instrukcji return. Je»eli metoda nic nie zwraca, jako zwracany typ nale»y zastosowa sªowo void. L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 11 / 37
Odwoªanie do metod klasy Po utworzeniu obiektu do jego metod nale»y odwoªywa si : za pomoc operatora wyboru skªadowej kropiki '.': Klasa zmienna; zmienna.metoda(argumenty); za pomoc operatora wyboru skªadowej oznaczonego symbolem '->', o ile obiekt zostaª utworzony przy u»yciu operatora new: Klasa* wskaznik = new Klasa(argumenty); wskaznik->metoda(argumenty); L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 12 / 37
Modykatory dost pu W j zyku C++ dost p do skªadowych klasy jest okre±lany za pomoc sªów kluczowych (modykatorów dostepu): private: skªadowe nie s dost pne dla klienta klasy (aplikacji korzystaj cej z klasy), dost p do tych skªadowych maj tylko metody klasy, public: skªadowe s dost pne dla klienta klasy, nie ma ogranicze«dost pu, protected: wykorzystywane podczas dziedziczenia, dost p do nich maj metody klasy lub metody klas potomnych. Uwaga Domy±lnie, je»eli przed pierwsz skªadow klasy nie wyst puje»adne okreslenie, dost p jest prywatny, co oznacza,»e dost p do tej skªadowej maj tylko metody deniowanej klasy. L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 13 / 37
Przykªad 1 - denicja klasy class Baton { public: //metody void setnazwa(string nazwabatonu) { nazwa = nazwabatonu; } void setilosc(int iloscbatonu) { ilosc = iloscbatonu; } void setcena(float cenabatonu) { cena = cenabatonu; } void wypisz() { cout << nazwa << ", " << ilosc << " szt., "; cout << cena << "zl" << endl; } private://pola string nazwa; int ilosc; float cena; }; L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 14 / 37
Przykªad 1 - obiekty klasy int main() { Baton baton1; baton1.setnazwa("mars"); baton1.setilosc(14); baton1.setcena(3.15); baton1.wypisz(); Baton baton2; } baton2.setnazwa("prince Polo"); baton2.setilosc(100); baton2.setcena(1.95); baton2.wypisz(); L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 15 / 37
Przykªad 2 - deklaracja metod w denicji klasy class Baton { public: //metody void setnazwa(string nazwabatonu); void setilosc(int iloscbatonu); void setcena(float cenabatonu); void wypisz(); private://pola string nazwa; int ilosc; float cena; }; L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 16 / 37
Przykªad 2 - denicja metod klasy Baton void Baton::setNazwa(string nazwabatonu) { nazwa = nazwabatonu; } void Baton::setIlosc(int iloscbatonu) { ilosc = iloscbatonu; } void Baton::setCena(float cenabatonu) { cena = cenabatonu; } void Baton::wypisz() { cout << nazwa << ", " << ilosc << " szt., "; cout << cena << "zl" << endl; } L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 17 / 37
Przykªad 3 - inicjalizacja pól w ciele klasy tylko w C++11 class Baton { public: //metody void setnazwa(const string& nazwabatonu); void setilosc(int iloscbatonu); void setcena(float cenabatonu); void wypisz(); private://pola string nazwa = ""; int ilosc = 0; float cena = 0.00; }; int main(){ Baton baton1; baton1.wypisz(); } L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 18 / 37
Przykªad 4 - Baton.h #ifndef BATON_H #define BATON_H #include <string> using namespace std; class Baton { public: //metody void setnazwa(const string& nazwabatonu); void setilosc(int iloscbatonu); void setcena(float cenabatonu); void wypisz(); private://pola string nazwa; int ilosc; float cena; }; #endif L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 19 / 37
Przykªad 4 - Baton.cpp #include <iostream> #include "Baton.h" void Baton::setNazwa(string nazwabatonu) { nazwa = nazwabatonu; } void Baton::setIlosc(int iloscbatonu) { ilosc = iloscbatonu; } void Baton::setCena(float cenabatonu) { cena = cenabatonu; } void Baton::wypisz() { cout << nazwa << ", " << ilosc << " szt., "; cout << cena << "zl" << endl; } L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 20 / 37
Przykªad 4 - main.cpp #include <iostream> #include <string> #include "Baton.h" using namespace std; int main() { Baton baton1; } baton1.setnazwa("mars"); baton1.setilosc(14); baton1.setcena(3.15); baton1.wypisz(); L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 21 / 37
Konstruktor klasy Konstruktor gwarantuje poprawn inicjalizacj obiektu. Jest on automatycznie wywoªywany przez kompilator, w miejscu, w którym tworzony jest obiekt, zanim jeszcze klient klasy b dzie mógª podj jakiekolwiek dziaªania zwi zane z obiektem. Konstruktor mo»e posiada argumenty okre±laj ce sposób tworzenia obiektu. L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 22 / 37
Konstruktory klas Konstruktor to specjalna metoda, która jest wywoªywana podczas tworzenia obiektu. Musi mie nazw zgodn z nazw klasy. Konstruktor nigdy nie zwraca»adnego wyniku, ale nie wyst puje przed nim sªowo void. Konstruktor mo»e by bezargumentowy, jak te» mo»e przyjmowa argumenty, które zostan wykorzystane, bezpo±rednio lub po±rednio, np. do zainicjalizowania pól obiektu. Ka»da klasa mo»e mie kilka konstruktorów, ró»ni cych si przyjmowanymi argumentami - przeci»anie konstruktora. Je±li w klasie wyst puje tylko jeden konstruktor i przyjmuje on argumenty, to przy tworzeniu obiektu nale»y je poda. L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 23 / 37
Konstruktory klasy Je±li nie zdeniuje si»adnego wªasnego konstruktora inicjuj cego, to kompilator automatycznie stworzy wªasny domy±lny (czyli bez parametrów) konstruktor inicjuj cy. Konstruktor domy±lny stworzony przez kompilator nie przypisuje warto±ci pocz tkowych skªadowym klasy. Konstruktor domy±lny to konstruktor, który mo»e zosta wywoªany bez podawania argumentów. Zdeniowanie cho jednego wªasnego konstruktora spowoduje,»e kompilator przyjmie,»e klasa ma wªasne konstruktory i nie utworzy swojego konstruktora domy±lnego. Je±li potrzebny jest konstruktor bez parametrów, trzeba go samemu utworzy. W ciele konstruktora (tak jak w ka»dej innej metodzie) mo»na wywoªywa inne metody. Podobnie jak w funkcjach i metodach, tak»e w konstruktorach mo»na zadeklarowa warto±ci domy±lne argumentów. L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 24 / 37
Przykªad 5 - Baton.h #ifndef BATON_H #define BATON_H #include <string> using namespace std; class Baton { public: //metody Baton(const string& nazwabatonu); void setnazwa(const string& nazwabatonu); void setilosc(int iloscbatonu); void setcena(float cenabatonu); void wypisz(); private://pola string nazwa; int ilosc = 0; float cena = 0; }; #endif L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 25 / 37
Przykªad 5 - Baton.cpp #include <iostream> #include "Baton.h" Baton::Baton(const string& nazwabatonu) { nazwa = nazwabatonu; }... L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 26 / 37
Przykªad 5 - main.cpp #include <iostream> #include <string> #include "Baton.h" using namespace std; int main() { Baton baton1("mars"); baton1.setilosc(14); baton1.setcena(3.15); baton1.wypisz(); Baton baton2 = Baton("Mars1"); baton2.setilosc(4); baton2.setcena(2.15); baton2.wypisz(); Baton* baton3 = new Baton("Mars2"); baton3->wypisz(); } L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 27 / 37
this Wywoªana funkcja skªadowa klasy (metoda) otrzymuje niejawnie adres obiektu, na rzecz którego zostaªa wywoªana. Adres ten jest przechowywany w zmiennej wska¹nikowej o nazwie this. (Który obiekt? Ten (this) obiekt.) Odwoªanie do pól i metod obiektu do którego this si odwoªuje, odbywa si za pomoc operatora wyboru skªadowej oznaczanego symbolem '->'. Umo»liwia to m.in. stosowanie w metodach i konstruktorach argumentów o nazwach identycznych z nazwami pól klasy. L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 28 / 37
Przykªad 5 - Baton.h #ifndef BATON_H #define BATON_H #include <string> using namespace std; class Baton { public: //metody Baton(const string& nazwa=""); Baton(const string& nazwa, int ilosc, float cena);... private://pola string nazwa; int ilosc = 0; float cena = 0; }; #endif L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 29 / 37
Przykªad 5 - Baton.cpp #include <iostream> #include "Baton.h" Baton::Baton(const string& nazwa) { this->nazwa = nazwa; } Baton::Baton(const string& nazwa, int ilosc, float cena) { this->nazwa = nazwa; this->ilosc = ilosc; this->cena = cena; }... L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 30 / 37
Metody staªe Metody, które nie zmieniaj warto±ci pól obiektu mog, a wr cz powinny by deklarowane jako const. class Baton { public: //metody... void wypisz() const;... }; void Baton::wypisz() const { cout << nazwa << ", " << ilosc << " szt., "; cout << cena << "zl" << endl; } L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 31 / 37
Zalecanym sposobem inicjalizacji pól obiektu jest zastosowanie listy inicjalizacyjnej. Lista inicjalizacyjna zaczyna si dwukropkiem umieszczonym za nawiasami zawieraj cymi argumenty. Po dwukropku wyst puje lista argumentów oddzielonych przecinkami, a po ka»dym argumencie podaje si w nawiasach warto±ci pocz tkowe argumentów. class Baton { public:... Baton(const string& nazwa, int ilosc = 0, float cena = 0.0);... }; Baton::Baton(const string& nazwa, int ilosc, float cena) :nazwa(nazwa),ilosc(ilosc),cena(cena){} L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 32 / 37
Destruktory klas Destruktor jest to specjalna metoda automatycznie wywoªywana podczas usuwania obiektu danej klasy, co ma miejsce, gdy: ko«czy si zasi g deklaracji obiektu, usuwany jest obiekt tymczasowy (patrz wykªad 3), do wska¹nika obiektu zastosowano operator delete. Celem destruktora jest zako«czenie istnienia obiektu danej klasy w sposób przewidywalny i uporz dkowany. Je±li nie zdeniuje si wªasnego destruktora, to kompilator automatycznie stworzy wªasny domy±lny destruktor. Destruktor deniowany przez u»ytkownika ma tak sam nazw jak klasa poprzedzon znakiem tyldy ( ), jest funkcj bez okre±lonego typu wyniku. Do destruktora nie przekazujemy»adnych argumentów. W klasie mo»na zdeniowa tylko jeden destruktor. L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 33 / 37
Przykªad 6 - Destruktor class Baton { public: Baton(const string& nazwa, int ilosc = 0, float cena = 0.0); ~Baton();... }; Baton::~Baton() { } cout << "Destruktor" << endl; L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 34 / 37
Skªadowe statyczne Zwykªe pola danych zawieraj warto±ci charakterystyczne dla danego obiektu i s tworzone jedno na obiekt. Chc c odwoªa si do zwykªego pola danych, trzeba wskaza obiekt, do którego ono nale»y. Statyczne pole danych klasy to takie pole danych, które istnieje niezale»nie od liczby utworzonych obiektów tej klasy, jest tworzone jedno na klas. Mo»e by zatem wykorzystywane do wspóªdzielenia informacji mi dzy wszystkimi obiektami klasy. Deklaracja statycznego pola danych ma posta : class Baton { };... static int ilenas;... L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 35 / 37
Statyczne skªadowe Inicjalizacja statycznego pola danych jest umieszczana poza klas : int Baton::ileNas=0; Do statycznego pola danych mo»na odwoªywa si bezpo±rednio, wskazuj c tylko klas : cout << Baton::ileNas; Metoda, która korzysta tylko ze skªadowych statycznych (czyli nie zale»y od»adnego obiektu) mo»e by zadeklarowana jako funkcja statyczna. Funkcja statyczna charakteryzuje si nast puj cymi wªa±ciwo±ciami: nie jest zwi zana z obiektem, nie ma zatem wska¹nika this, mo»e by wywoªywana samodzielnie, bez odwoªania si do obiektu. L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 36 / 37
Przykªad 7 class Baton { public: Baton(const string& nazwa):nazwa(nazwa){++ilenas;} ~Baton(){--ileNas;}... static int PokazIleNas();... private:... static int ilenas; }; int Baton::ileNas = 0; int Baton::PokazIleNas(){return ilenas;} L. St pie«(ajd) Programowanie obiektowe w C++Wykªad 1 37 / 37