1 / 27

Počítače a programování 2

Počítače a programování 2. Tutoriál 2 2 2 .2.2014 Jiří Šebesta. T ÉMA. Úvod do objektově orientovaného programování a C++ Třídy bez metod Třídy s metodami Konstruktory a destruktory Metody const Knihovní třídy Třídy ve třídě. PRPGRAM

yanni
Download Presentation

Počítače a programování 2

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Počítače a programování 2 Tutoriál 2 22.2.2014 Jiří Šebesta

  2. TÉMA Úvod do objektově orientovaného programování a C++ Třídy bez metod Třídy s metodami Konstruktory a destruktory Metody const Knihovní třídy Třídy ve třídě

  3. PRPGRAM - model popisující reálný problém – abstrakce problému a jeho popis algoritmem nad daty pomocí programovacího jazyka Úvod do OOP (1/4) ANSI - C - procedurální programování: nad daty (proměnné, vstupy ze souboru z klávesnice) provádíme sled procedur na základě definice algoritmu s využitím konstrukcí s klíčovými slovy jazyka C a s využitím funkcí - data oddělena od funkcí: problém specifikace obecného řešení problému, které je více svázaný s reálným pohledem na svět (obecně platí, že s určitou skupinou dat, lze provádět jen určité děje, nelze například dva řetěze dělit apod.)

  4. Objektově orientované programování OOP • pro snadnější abstrakci reálných úloh (přehledný a jednoznačný popis reálného problému programem – modelem) • propojuje data a funkce (operace) nad nimi • - základním prvkem programu je objekt – má dané chrakteristiky a dané metody (funkce nebo procedury, které lze s daným objektem provádět) Úvod do OOP (2/4) - objektem může být nějaký grafický komponent na obrazovce (např. tlačítko“Cancel”, které můžeme definovat souborem proměnných atributů jako je např. velikost tlačítka, barva, umístění na obrazovce, atribut jestli můžu taháním myší měnit jeho velikost apod., má ale také možné definované funkce – akce – na které je třeba reagovat, např. kliknutí na tlačítko myší, přejetí kurzorem přes tlačítko, reakce na nějakou klávesovou zkratku apod.)

  5. - objektem může být i model nějakého reálného objektu (např. tužka, která může mít proměnné atributy jako je např. tloušťka tuhy, barva, stav – ořezaná vs. neořezaná apod., má ale také možné definované funkce – akce – tužku lze ořezat, zkrátit apod.) Úvod do OOP (3/4) • ZÁKLADNÍ PILÍŘE OOP • ZAPOUZDĚNÍ - deklarace třídy pro daný objekt, který spojuje (zapouzdřuje proměnné a metody) = uživatelsky definovaný typ. • DĚDIČNOST – odvození nových tříd objektů od dříve deklarovaných, dědí se všechny původní atributy a metody, které se mohou modifikovat a přidávat i další nové atributy a metody (např. máme definovánu třídu zvíře, která má řadu atributů a metod a mohu z ní odvodit třídu savec s dalšími vlastnostmi typickými pro savce – např. doba kojení)

  6. POLYMORFISMUS (MNOHOTVAROST) - funkce tříd se mohou chovat různě (mít více forem), polymorfismus umožňuje objektům volání jedné metody se stejným jménem, ale s jinou implementací Úvod do OOP (4/4) Základní model objektu v OOP deklaruje TŘÍDA = deklarace proměnných (atributů) + deklarace metod pro daný objekt a dané proměnné objektu - vychází ze struktury (ANSI C) a je doplněna o metody (funkce nad daty třídy) - reprezentuje sbírku proměnných (obvykle různých typů) v kombinaci se sadou souvisejících funkcí

  7. Deklarace vlastní třídy Person (bez metod) Třídy bez metod (1/4) #include <iostream> class Person//own class declaration { public: unsigned int ID;//public members (variables) of class unsigned int age; }; int main() { Person Eva;//new object of class Person Eva.ID = 1;//value to public variable assignment Eva.age = 30; std::cout<<"Person with ID "<< Eva.ID <<" is"; std::cout<< Eva.age <<" years old." << endl;//out to std return0; } Příklad: Ex87.cpp

  8. Klíčové slovo public: definuje proměnné třídy, které jsou veřejně přístupné – lze je měnit kdykoli vně objektu Třídy bez metod (2/4) Klíčové slovo private: definuje proměnné třídy, které nejsou veřejně přístupné – lze je měnit jen metodami dané třídy std je standardní třída cout je standarní výstup cin je standardní vstup std::cout je definice standardního výstupu >> je operátor přesměrování endl= end of line

  9. V C++ lze definovat jmenný prostor (namespace) pro který jsou používány jména metod a proměnných dané třídy definované v namespacepomocí klíčového slovausing Třídy bez metod (3/4) … using namespacestd; //namespace std is set for using int main() { Person Eva;//new object of class Person Eva.ID = 1;//value to public variable assignment Eva.age = 30; cout<<"Person with ID "<< Eva.ID <<" is"; cout<< Eva.age <<" years old."<< endl;//out to std return0; } Příklad: Ex88.cpp

  10. Privátní proměnná třídy – nemá standardní přístup mimo třídu Třídy bez metod (4/4) #include <iostream> class Person//own class declaration { public: unsigned int ID; //public members (variables) of class private: //private members (variables) of class unsigned int age; }; int main() { Person Eva;//new object of class Person Eva.age = 30; //error – age is private member of class std::cout<< Eva.age;//error – age is private member return0; } Příklad: Ex89.cpp

  11. Deklarace metod třídy Třídy s metodami (1/4) #include <iostream> class Person//own class declaration { public: //public members (variables) of class voidSetAge(unsigned intnew_age); //methods are public unsigned intGetAge(); voidIncAge(); unsigned int ID; //variable private: //private members of class unsigned int age; }; Metody (funkce) třídy jsou vždy veřejné tak, aby mohly být využívány programem.

  12. Definice metod třídy Třídy s metodami (2/4) //definition of methods voidPerson::SetAge(unsignedintnew_age) //set new age of object { age = new_age; } unsigned intPerson::GetAge() //get and return age of object { return age; } voidPerson::IncAge() //increment age by one { age++; }

  13. S výhodou lze omezit rozsah privátní proměnné úpravou přístupové metody Možnost přesného vymezení rozsahu nebo výčtu (často se používají enumerativní typy proměnných) je další výhodou OOP Třídy s metodami (3/4) //definition of methods voidPerson::SetAge(unsignedintnew_age) //set new age of object - max. 150 years { if(new_age<= 150) age = new_age; } voidPerson::IncAge() //increment age by one - max. 150 years { if(age< 150) age++; }

  14. Použití metod třídy (jsou veřejné) k přístupu do privátní proměnné třídy Třídy s metodami (4/4) using namespacestd; int main() { unsigned int a; Person Eva;//new object of class Person cout<<"Insert Eva's age: "; cin>>a; //characters from cin (keyboard) to a as number Eva.SetAge(a); //calling method to set Eva's age Eva.IncAge(); //incrementation of Eva's age by one Eva.IncAge(); //again incrementation of Eva's age by one cout << endl << "Eva is"; cout << Eva.GetAge() << " years old"; return0; } Příklad: Ex90.cpp

  15. Při deklaraci třídy lze deklarovat speciální metody, které se provedou při vytvoření objektu nebo při odstranění objektu KONSTRUKTOR– metoda, která se volá při vytváření objektu DESTRUKTOR– metoda, která se volá při odstraňování objektu Konstruktory a destruktory (1/3) #include <iostream> class Person//own class declaration { public: //public members (variables) of class Person(unsigned intini_age); //constructor with age initialization ~Person(); //destructor voidSetAge(unsigned intnew_age); //methods unsigned intGetAge(); voidIncAge(); unsigned int ID; //variable private: //private members of class unsigned int age; };

  16. Definice konstruktoru / destruktoru, pokud není definováno je konstruktor a destruktor prázdný – jen se provede instance (vytvoření) prázdného objektu (konstruktor) a řádné odstranění objektu a uvolnění z paměti (destruktor). Konstruktory a destruktory (2/3) //constructor definition Person::Person(unsignedintini_age) { if(ini_age<= 150) age = ini_age; else age = 150; } //destructor definition – no action definition Person::~Person() { // empty destructor }

  17. Vytvoření objektu (instance třídy) pomocí definovaného konstruktoru Konstruktory a destruktory (3/3) using namespacestd; int main() { Person Eva(30);//new object of class Person using constructor Eva.IncAge(); //incrementation of Eva's age by one cout << "Eva is"; cout << Eva.GetAge() << " years old"; return0; } Parametry konstruktoru se předají příslušným proměnným objektu, lze tak provést prvotní inicializaci proměnných objektu Příklad: Ex91.cpp

  18. Nedovolený zásah do privátní proměnné – ochrana přístupu k privátním proměnným metodou pomocí klíčového slova const Metody const (1/1) #include <iostream> class Person//own class declaration { unsigned intGetAge() const; //const methods – cannot change variable members of class ... }; //definition of methods ... unsigned intPerson::GetAge() const { return age++; //error – changing variable member } Příklad: Ex92.cpp

  19. Knihovní deklarace vlastní třídy a řádkové metody Knihovní třídy (1/2) #ifndef PERSON_HPP_INCLUDED #define PERSON_HPP_INCLUDED #include <iostream> class Person//Person class declaration { public: //public members (variables) of class Person(unsigned intini_age); //constructor ~Person(); //destructor //row definitions of methods voidSetAge(unsigned intnew_age) {age = new_age;} unsigned intGetAge() {returnage;} voidIncAge() {age++;} private: //private members of class unsigned int age; }; #endif // PERSON_HPP_INCLUDED Příklad: person.hpp

  20. Instance třídy (vytvoření objektu) z knihovní deklarace třídy Knihovní třídy (2/2) //header file include #include "person.hpp" //constructor definition Person::Person(unsignedintini_age) { age = ini_age; } //destructor definition Person::~Person() { } int main() { Person Eva(30);//new object of class Person using constructor ... return0; } Příklad: Ex93.cpp + person.hpp

  21. Příklad:Třída pro popis objektu typu obdélník s využitím jednoduché třídy pro bod Třídy ve třídě (1/6) Deklarace třídy pro bod- dvě souřadnice + přístupové metody #ifndef RECT_HPP_INCLUDED #define RECT_HPP_INCLUDED #include <iostream> classPoint//coordinates x,y { public: voidSetX(intx) {X = x;} voidSetY(inty) {Y = y;} intGetX()const {returnX;} intGetY()const {returnY;} private: intX; intY; };

  22. Deklarace třídy pro obdélník: 4x proměnná typu int 4x proměnná typu Point Třídy ve třídě (2/6) classRect//rectangle class { public: Rect (inttop, intleft, intbottom, intright); ~Rect () {} intGetTop() const {returnTop;} intGetLeft() const {returnLeft;} intGetBottom() const {returnBottom;} intGetRight() const {returnRight;} Point GetTopLeft() const {returnTopLeft;} Point GetTopRight() const {returnTopRight;} Point GetBottomLeft() const {returnBottomLeft;} Point GetBottomRight() const {returnBottomRight;}

  23. Metody přístupové metody k privátním proměnným + výpočet plochy Třídy ve třídě (3/6) voidSetTopLeft(Pointpos) {TopLeft = pos;} voidSetTopRight(Pointpos) {TopRight = pos;} voidSetBottomLeft(Pointpos) {BottomLeft = pos;} voidSetBottomRight(Pointpos) {BottomRight = pos;} voidSetTop(inttop) {Top = top;} voidSetLeft(intleft) {Left = left;} voidSetBottom(intbottom) {Bottom = bottom;} voidSetRight(intright) {Right = right;} intGetArea() const;

  24. Třídy ve třídě (4/6) private: Point TopLeft; Point TopRight; Point BottomLeft; Point BottomRight; intTop; intLeft; intBottom; intRight; }; #endif // RECT_HPP_INCLUDED Deklarace třídy Rect uložena jako knihovna v souboru rect.hpp Příklad: rect.hpp

  25. Konstruktor pro třídu Rect – inicializace pomocí int parametrů, Point proměnné lze přímo dovodit a naplnit Třídy ve třídě (5/6) #include "rect.hpp" Rect::Rect(inttop, intleft, intbottom, intright) { Top = top; Left = left; Bottom = bottom; Right = right; TopLeft.SetX(left); TopLeft.SetY(top); TopRight.SetX(right); TopRight.SetY(top); BottomLeft.SetX(left); BottomLeft.SetY(bottom); BottomRight.SetX(right); BottomRight.SetY(bottom); }

  26. Definice pro výpočet plochy obdélníku amain() Třídy ve třídě (6/6) intRect::GetArea() const { intw = Right - Left; inth = Top - Bottom; return (w * h); } intmain() { Rectmy_rect(10, 5, 0, 25); //new object - local variable intS = my_rect.GetArea(); std::cout << "Area: " << S << "\n"; return0; } Příklad: Ex94.cpp + rect.hpp

  27. TÉMA NÁSLEDUJÍCÍHOTUTORIÁLU OOP (dědičnost, polymorfismus) a programování pro Windows DĚKUJI ZA POZORNOST

More Related