PB161 Programování v jazyce C++ Přednáška 7

Podobné dokumenty
PB161 Programování v jazyce C++ Přednáška 7

PB161 Základy OOP. Tomáš Brukner

PB161 Programování v jazyce C++ Přednáška 1

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

Základy objektové orientace I. Únor 2010

Dědění, polymorfismus

Programování II. Polymorfismus

PB přednáška (21. září 2015)

PB161 Programování v jazyce C++ Přednáška 9

NMIN201 Objektově orientované programování 1 / :36:09

Programování v C++ 3, 3. cvičení

Virtuální metody - polymorfizmus

NPRG031 Programování II 1 / :25:46

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března

PB161 Programování v jazyce C++ Přednáška 10

PB161 Programování v jazyce C++ Přednáška 10

24. listopadu 2013, Brno Připravil: David Procházka

PB161 Programování v jazyce C++ Přednáška 3

Programování v C++ 1, 6. cvičení

Objektové programování

IB111 Úvod do programování skrze Python Přednáška 13

IRAE 07/08 Přednáška č. 1

Jazyk C++ I. Polymorfismus

PB161 Programování v jazyce C++ Přednáška 4

Generické programování

Jazyk C++ 1. Blok 3 Objektové typy jazyka C++ Třída. Studijní cíl. Doba nutná k nastudování. Průvodce studiem

PB161 Programování v jazyce C++ Přednáška 2

7. OBJEKTOVĚ ORIENTOVANÉ PROGRAMOVÁNÍ

Objektově orientovaný přístup

Programování v C++ VI

Programování v C++ 2, 4. cvičení

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda

Matematika v programovacích

1. Programování proti rozhraní

7.3 Diagramy tříd - základy

11 Diagram tříd, asociace, dědičnost, abstraktní třídy

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Vyřešené teoretické otázky do OOP ( )

Objektově orientované programování. Úvod

7.3 Diagramy tříd - základy

PREPROCESOR POKRAČOVÁNÍ

Chování konstruktorů a destruktorů při dědění

Programování v C++ 1, 5. cvičení

Diagramy tříd - základy

1. Dědičnost a polymorfismus

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Programování II. Abstraktní třída Vícenásobná dědičnost 2018/19

PB161 Programování v jazyce C++ Přednáška 8

DTP Základy programování Úvod do předmětu

11. Přehled prog. jazyků

Návrhové vzory OMO, LS 2014/2015

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Jazyk C# (seminář 3)

PB161 Programování v jazyce C++ Přednáška 4

Viditelnost (práva přístupu) Tomáš Pitner, upravil Marek Šabo

10 Balíčky, grafické znázornění tříd, základy zapozdření

PB přednáška (5. října 2015)

Programování II. Modularita 2017/18

Dědičnost. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 23.března

Objektově orientované programování v jazyce Python

Jazyk C++ I. Šablony 2

Výčtový typ strana 67

Objektově orientované programování v jazyce Python

Jazyk C++ II. Šablony a implementace

6 Objektově-orientovaný vývoj programového vybavení

IB111 Programování a algoritmizace. Programovací jazyky

Nepravidlové a hybridní znalostní systémy

Zpracoval:

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Více o konstruktorech a destruktorech

9. Polymorfismus a rozhraní

Polymorfismus. Porovnání jazyků z hlediska polymorfismu Jazyky C, C++, C# Jazyk Java PHP a jiné Na závěr souhrn vlastností jednotlivých jazyků

Funkční objekty v C++.

PB161 Programování v jazyce C++ Přednáška 2

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

20. Projekt Domácí mediotéka

Sada 1 - Základy programování

Úvod. Programovací paradigmata

Programování v C++ Úplnej úvod. Peta (maj@arcig.cz, SPR AG )

Dědičnost. seskupování tříd do hierarchie. potomek získá všechny vlastnosti a metody. provádí se pomocí dvojtečky za názvem třídy.

Jazyk C++ I. Šablony

Ukazka knihy z internetoveho knihkupectvi

Programování II. Třídy a objekty (objektová orientovanost) 2018/19

PŘETĚŽOVÁNÍ OPERÁTORŮ

IB111 Úvod do programování skrze Python Přednáška 13

Programovací jazyky Přehled a vývoj

Dědičnost (inheritance)

7.5 Diagram tříd pokročilé techniky

Objekty a třídy. Procedurální a objektově orientované programování. V této kapitole se naučíte: Procedurální a objektově orientované programování

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

PB přednáška (23. listopadu 2015)

přetížení operátorů (o)

Pokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++

ČÁST 1. Zahřívací kolo. Co je a k čemu je návrhový vzor 33

Úvod do programovacích jazyků (Java)

Transkript:

PB161 Programování v jazyce C++ Přednáška 7 Statické položky tříd Základy OOP Nikola Beneš 6. listopadu 2018 PB161 přednáška 7: static, základy OOP 6. listopadu 2018 1 / 21

Klíčové slovo static Znáte z C statické proměnné uvnitř funkcí uchovávají si hodnotu mezi voláními funkce (schované globální proměnné) Statické položky (atributy, metody) tříd patří třídě jako takové, ne jejím objektům je možno k nim přistupovat i bez aktuálního objektu mohou k nim přistupovat i objekty inicializace statických atributů ne v hlavičkovém souboru (proč?) mimo deklaraci třídy od C++17 můžeme psát inline i ke statickým atributům, tyto pak můžou být inicializovány přímo uvnitř deklarace třídy https://en.cppreference.com/w/cpp/language/static lecture07_01.cpp PB161 přednáška 7: static, základy OOP 6. listopadu 2018 2 / 21

Programovací jazyky Paradigmata (hrubé rozdělení) deklarativní logické programování funkcionální programování a jiné (SQL, constraint programming, ) imperativní procedurální (C, Pascal, ) objektově orientované čisté OOP (posílání zpráv; Objective C, ) třídy a metody (C++, Java, C#, ) prototypy (Javascript, ) a mnohá další https://en.wikipedia.org/wiki/programming_paradigm PB161 přednáška 7: static, základy OOP 6. listopadu 2018 3 / 21

Programovací jazyky Jedno paradigma? moderní programovací jazyky jsou typicky multiparadigmatické C++: paralelní, funkcionální, generické, metaprogramování, imperativní, objektově orientované (založené na třídách) https://en.wikipedia.org/wiki/list_of_programming_languages_by_type https://en.wikipedia.org/wiki/comparison_of_multiparadigm_programming_languages Nezapomínejte: není žádné jedno ideální paradigma stejně jako není žádný jeden ideální jazyk PB161 přednáška 7: static, základy OOP 6. listopadu 2018 4 / 21

Základní představa OOP svět se skládá z objektů objekty mají svůj vnitřní stav, který není vidět objekty komunikují pomocí zpráv objekty se často vytvářejí podle vzoru (třída, prototyp, ) PB161 přednáška 7: static, základy OOP 6. listopadu 2018 5 / 21

Objektově orientované programování Klasické (čisté) OOP Smalltalk, Objective C, (Python) všechno je objekt (včetně tříd); objekty si posílají zprávy můžeme napsat objekt, který dokáže přijmout libovolnou zprávu objekty mohou přeposílat zprávy jiným objektům objekty mohou měnit své chování (reakci na zprávy) za běhu OOP ve stylu C++/Java/C# třída je datový typ; objekt je instance třídy (hodnota daného typu) třídy definují metody; posílání zpráv je volání metod rozhraní (seznam metod) třídy je statické (nemění se za běhu) PB161 přednáška 7: static, základy OOP 6. listopadu 2018 6 / 21

Principy OOP Zapouzdření Abstrakce Dědičnost Polymorfismus PB161 přednáška 7: static, základy OOP 6. listopadu 2018 7 / 21

Principy OOP Zapouzdření (Encapsulation) Objekt Data Kód Rozhraní data i kód na jednom místě objekt komunikuje jen skrze rozhraní umožňuje skrýt vnitřní reprezentaci dat Výhody: možnost změnit vnitřní implementaci ochrana proti chybám nutí rozvrhnout program do nezávislých částí umožňuje další OOP vlastnosti PB161 přednáška 7: static, základy OOP 6. listopadu 2018 8 / 21

Principy OOP Abstrakce souvisí se zapouzdřením umožňuje pracovat s ideální představou, nezatěžuje programátora implementačními detaily Datová abstrakce použití dat bez znalosti skutečného umístění/reprezentace příklad: soubor na disku, na serveru, Funkční abstrakce uživatel nemusí znát detaily implementace příklad (strategická hra): zpráva zaútoč pro různé druhy jednotek PB161 přednáška 7: static, základy OOP 6. listopadu 2018 9 / 21

Principy OOP Dědičnost objekt (třída) může dědit od jiného objektu (třídy) vztah předek potomek (podtyp nadtyp) může snižovat opakování kódu; umožňuje polymorfismus Příklad: Pozemní jednotka Rytíř Lučištník Liskovové princip nahraditelnosti: potomek může zastoupit předka Vícenásobná dědičnost, kompozice: příště PB161 přednáška 7: static, základy OOP 6. listopadu 2018 10 / 21

Principy OOP Polymorfismus souvisí s abstrakcí umožňuje psát kód obecně, pouze se znalostí rozhraní polymorfismus skrze dědičnost Příklad: poslat všem pozemním jednotkám ve vybrané oblasti stejný povel existují i jiné způsoby realizace polymorfismu PB161 přednáška 7: static, základy OOP 6. listopadu 2018 11 / 21

Polymorfismus Obecný princip polymorfismu možnost psát obecný kód, který funguje s různými typy objektů Různé realizace polymorfismu přetěžování funkcí ad-hoc polymorfismus generické programování (C++: šablony, jiné jazyky: generika, ) parametrický polymorfismus ve funkcionálním programování: často jediný druh polymorfismu dědičnost podtypový polymorfismus (subtype polymorphism) PB161 přednáška 7: static, základy OOP 6. listopadu 2018 12 / 21

Realizace OOP v C++ přístup založený na třídách (class, struct) členské proměnné tříd atributy členské funkce metody přístupová práva public vidí všichni private vidí jen objekty dané třídy (+ přátelé) protected vidí objekty dané třídy a jejích potomků (+ přátelé) implicitní přístupová práva class private struct public PB161 přednáška 7: static, základy OOP 6. listopadu 2018 13 / 21

Realizace OOP v C++ Dědičnost (inheritance) třída v C++ může dědit od jiné třídy class Animal { /*... */ }; class Dog : public Animal { /*... */ }; co to znamená? všechny atributy Animal jsou i atributy Dog (jaký je k nim přístup?) všechny metody Animal jsou i metody Dog (ale co když chceme jiné chování?) PB161 přednáška 7: static, základy OOP 6. listopadu 2018 14 / 21

Realizace OOP v C++ Dědičnost a přístupová práva metody potomka (Dog) mají možnost přistupovat pouze k public a protected položkám předka (Animal) z vnějšku je možno přistupovat ke všem public položkám potomka, ať už jsou definovány v potomkovi nebo předkovi Jiná než veřejná dědičnost pro zajímavost, v tomto předmětu nebudeme používat protected dědičnost všechny public položky předka se změní na protected; podobně private není vztah podtyp nadtyp (tj. IS-A; více příště) http://www.gotw.ca/publications/mill06.htm PB161 přednáška 7: static, základy OOP 6. listopadu 2018 15 / 21

Realizace OOP v C++ Co bude výstupem? class Animal { public: void speak() const { std::cout << "<generic sound>\n"; } }; class Dog : public Animal { public: void speak() const { std::cout << "Whoof\n"; } }; int main() { Dog laika; Animal& animal = laika; laika.speak(); animal.speak(); lecture07_02.cpp } PB161 přednáška 7: static, základy OOP 6. listopadu 2018 16 / 21

Časná a pozdní vazba Časná vazba (early binding) klasické volání funkcí a metod překladač ví při překladu, kterou metodu má volat v kódu (assembleru) je přímo adresa funkce https://godbolt.org/g/ndqasd Pozdní vazba (late binding) která metoda se má volat, se zjistí až za běhu v C++ klíčové slovo virtual každá třída má tabulku virtuálních funkcí každý objekt si s sebou nese ukazatel do správné tabulky https://godbolt.org/g/tuf8cd Zkuste si zde: https://godbolt.org/g/xbv5b7 PB161 přednáška 7: static, základy OOP 6. listopadu 2018 17 / 21

Tabulka virtuálních metod PB161 přednáška 7: static, základy OOP 6. listopadu 2018 18 / 21

Časná a pozdní vazba Časná vazba metoda známa v době překladu v asm kódu přímo adresa funkce rychlejší v C++ implicitní způsob Pozdní vazba metoda známa až za běhu nutno se podívat do vtable pomalejší v C++ klíčové slovo virtual PB161 přednáška 7: static, základy OOP 6. listopadu 2018 19 / 21

Různé využití tříd/objektů v C++ Polymorfní třídy Hodnotové třídy RAII třídy virtuální metody inline metody inline metody objekty s identitou bez identity objekty spravují zdroje chování (interní) stav (externí) stav typicky se nekopírují typicky se kopírují typicky se nekopírují, ani nepřesouvají a přesouvají ale přesouvat se mohou často se alokují typicky se používají téměř vždy se používají na haldě lokálně lokálně OOP se zabývá třídami v levém sloupci (toto není nutně vyčerpávající klasifikace všech typů tříd v C++) pro zajímavost: https://www.youtube.com/watch?v=_cwvvbsze6m PB161 přednáška 7: static, základy OOP 6. listopadu 2018 20 / 21

Kvíz class A { public: void f() { cout << "Af "; } virtual void g() { cout << "Ag "; } }; class B : public A { public: void f() { cout << "Bf "; } virtual void g() override { cout << "Bg "; } }; int main() { } A a; a.f(); a.g(); // 1 B b; b.f(); b.g(); // 2 A& refa = a; refa.f(); refa.g(); // 3 A& refb = b; refb.f(); refb.g(); // 4 lecture07_03.cpp PB161 přednáška 7: static, základy OOP 6. listopadu 2018 21 / 21