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

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

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

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

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

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

Dědění, polymorfismus

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

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

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

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

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

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

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

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í v C++ VI

Generické programování

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.

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

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

Programování v jazyce C a C++

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

Více o konstruktorech a destruktorech

PREPROCESOR POKRAČOVÁNÍ

Programování II. Polymorfismus

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

Objektové programování

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

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

Jazyk C++ I. Polymorfismus

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

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

Objektově orientované programování. Úvod

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

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

Úvod. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík,2016

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

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

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

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

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

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

Zapouzdření. Tomáš Pitner, upravil Marek Šabo

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

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

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

Programování II. Modularita 2017/18

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

8 Třídy, objekty, metody, předávání argumentů metod

Teoretické minimum z PJV

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

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

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

Virtuální metody - polymorfizmus

Jazyk C# (seminář 3)

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

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

Dědičnost (inheritance)

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

1. Programování proti rozhraní

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

konstruktory a destruktory (o)

Ukazka knihy z internetoveho knihkupectvi

Programování II. Návrh programu II

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

Principy objektově orientovaného programování

OBJEKTOVÉ PROGRAMOVÁNÍ V C++ V PŘÍKLADECH 8 Proudová knihovna 8.1 Hierarchie proudů Standardně zavedené proudy

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

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

PROGRAMOVÁNÍ V C++ CVIČENÍ

Pokročilé programování v jazyce C pro chemiky (C3220) Dědičnost tříd v C++

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

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

PB161 programování v C++ Výjimky Bezpečné programování

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Konstruktory a destruktory

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

16. února 2015, Brno Připravil: David Procházka. Konstruktory a destruktory

Výčtový typ strana 67

Programování II. Návrh programu I 2018/19

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

Mělká a hluboká kopie

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

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

Funkční objekty v C++.

7. OBJEKTOVĚ ORIENTOVANÉ PROGRAMOVÁNÍ

7.3 Diagramy tříd - základy

KTE / ZPE Informační technologie

Jazyk C# (seminář 6)

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Zpracoval:

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

7.3 Diagramy tříd - základy

Objektově orientované programování v jazyce Python

Návrhové vzory OMO, LS 2014/2015

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Diagramy tříd - základy

Transkript:

.. PB161 Programování v jazyce C++ Přednáška 1 Organizace Úvod do OOP v C++ Nikola Beneš 21. září 2015 PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 1 / 39

Cíle předmětu 1. vysvětlit základy OOP 2. seznámit s možnostmi jazyka C++ 3. podpořit praktické programátorské schopnosti 4. nadchnout do (nebo alespoň neodradit od) programování PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 2 / 39

.. Organizace předmětu http://cecko.eu/public/pb161 PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 3 / 39

Organizace předmětu Přednášky Cvičení. nepovinné, ale snad přínosné a zábavné :-) během jedné vnitrosemestrální test zvané přednášky ke konci semestru povinná, dvě neomluvené neúčasti tolerovány aktivní práce na příkladech, konzultace průběžné testíky formou odpovědníků možnost párového programování poslední týden zápočtový příklad Přednášky Cvičení Domácí úkoly PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 4 / 39

Domácí úkoly Přednášky Cvičení pět úkolů, jeden navíc Domácí úkoly max 12 bodů za úkol + bonusy deadline na stránce úkolu odevzdávání do fakultní SVN, max 3 ostré pokusy, odevzdávání nanečisto ukázková řešení valgrind: chyby nalezené valgrindem snižují hodnocení o dvě pětiny podmínka k zápočtu: alespoň 4 domácí úkoly s nenulovým hodnocením detaily na http://cecko.eu/public/pb161. PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 5 / 39

Varování Neopisujte! ubližujete sami sobě provádíme automatickou kontrolu opisování opisování = 0b za úkol (pro oba) Nezveřejňujte svá řešení! stejný postih jako za opisování zákaz zveřejňovat řešení i po termínu domácího úkolu Neotvírejte odpovědníky jindy než na cvičení!. cvičící kontrolují, kdo je na cvičení hodnoceno -5 body PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 6 / 39

Bodování tvrdé a měkké body měkké se nepočítají do limitu pro zápočet a zkoušku domácí úkoly 6 12 = 72 odpovědníky 10 3 = 30 vnitrosemestrální test 20 celkem (tvrdé body) 122 zkouškový test: 80 bodů měkké body: bonusové části domácích úkolů body za aktivitu na cvičeních PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 7 / 39

Hodnocení Zápočet Zkouška >= 65 tvrdých bodů, 4 nenulové domácí úkoly, zápočtový příklad >= 95 tvrdých bodů, zápočet známka podle součtu tvrdých a měkkých bodů: >= 170 bodů A >= 150 bodů B >= 130 bodů C >= 110 bodů D >= 95 bodů E PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 8 / 39

Učební materiály podklady k přednáškám, slidy, ukázkové zdrojáky http://cecko.eu/public/pb161 záznamy přednášek v ISu http://cppreference.com http://cplusplus.com ukázka: online dokumentace PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 9 / 39

Kontakty Přednášející: Nikola Beneš xbenes3@fi.muni.cz konzultační hodiny: pondělí 14.10 15.40 B421 Cvičící: podle rozvrhu Studentští poradci konzultační hodiny na http://cecko.eu/public/pb161 od druhého týdne semestru PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 10 / 39

Zpětná vazba předmětová anketa v ISu (až na konci semestru) občasné dotazníky (obtížnost úloh apod.) osobně, e-mailem krabice pro anonymní vzkazy PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 11 / 39

.. Programovací jazyk C++ PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 12 / 39

Historie a vývoj 1978 C K&R PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 13 / 39

Historie a vývoj C with Classes B. Stroustrup 1979 1978 C K&R PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 13 / 39

Historie a vývoj C with Classes B. Stroustrup 1979 C++ 1983 1978 C K&R PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 13 / 39

Historie a vývoj C with Classes B. Stroustrup 1979 C++ 1983 ISO C++98 1998 1978 C K&R PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 13 / 39

Historie a vývoj C with Classes B. Stroustrup 1979 C++ 1983 ISO C++98 1998 ISO C++03 2003 1978 C K&R PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 13 / 39

Historie a vývoj C with Classes B. Stroustrup 1979 C++ 1983 ISO C++98 1998 ISO C++03 2003 ISO C++11 2011 1978 C K&R PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 13 / 39

Historie a vývoj C with Classes B. Stroustrup 1979 C++ 1983 ISO C++98 1998 ISO C++03 2003 ISO C++14 2014 ISO C++11 2011 1978 C K&R Budoucnost: C++17, Nestandardizovaná rozšíření PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 13 / 39

Historie a vývoj C with Classes B. Stroustrup 1979 C++ 1983 ISO C++98 1998 ISO C++03 2003 ISO C++14 2014 ISO C++11 2011 1978 C K&R 1989 ISO C89 1999 ISO C99 2011 ISO C11 Budoucnost: C++17, Nestandardizovaná rozšíření PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 13 / 39

Historie a vývoj C with Classes B. Stroustrup 1979 C++ 1983 ISO C++98 1998 ISO C++03 2003 ISO C++14 2014 ISO C++11 2011 1978 C K&R 1989 ISO C89 1999 ISO C99 2011 ISO C11 Budoucnost: C++17, Nestandardizovaná rozšíření PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 13 / 39

Charakteristika C++ imperativní, staticky typovaný jazyk objektově-orientovaný s funkcionálními prvky (zejména od C++11) podporuje generické programování (šablony) částečně zpětně kompatibilní s C rozsáhlá standardní knihovna malloc. free new delete PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 14 / 39

Proč používat C++? široké rozšíření vysoká rychlost kódu univerzálnost vhodné pro větší projekty systémové aplikace rychlou grafiku embedded zařízení spíše nevhodné pro webové aplikace rychlé prototypy http://benchmarksgame.alioth.debian.org/ PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 15 / 39

.. Objektově orientované programování PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 16 / 39

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. PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 17 / 39

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 1: organizace, úvod do OOP v C++ 21. září 2015 17 / 39

Příklad Strategická hra co jsou objekty? co jsou zprávy? PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 18 / 39

Principy OOP Zapouzdření Abstrakce Dědičnost Polymorfismus PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 19 / 39

Principy OOP Zapouzdření 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: PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 20 / 39

Principy OOP Zapouzdření 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 1: organizace, úvod do OOP v C++ 21. září 2015 20 / 39

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 1: organizace, úvod do OOP v C++ 21. září 2015 21 / 39

Principy OOP Dědičnost Příklad: objekt (třída) může dědit od jiného objektu (třídy) vztah předek potomek snižuje opakování kódu Pozemní jednotka. Rytíř Lučištník Liskovové princip nahraditelnosti: potomek vždy může zastoupit předka Vícenásobná dědičnost, kompozice: příště PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 22 / 39

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 (generické programování) PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 23 / 39

OOP jako styl myšlení Object-Oriented Design OOP je přístup k řešení objektový návrh: co jsou objekty, jaké mají vztahy můžeme programovat objektově i v neobjektových jazycích v OOP jazycích ale máme syntaktickou podporu Příklad v jazyce C struct Archer { int hit_points; int range; int x, y; }; void movearcher(struct Archer * archer, int tx, int ty) { //... kód pro pohyb lučištníka } PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 24 / 39

.. Realizace OOP v C++ PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 25 / 39

OOP v C++ Přístup založený na třídách: class rozšíření datového typu struct z C v C++ máme class i struct, liší se v přístupových právech kromě atributů (dat) můžou obsahovat i metody (funkce) přístupová práva: public vidí všichni protected vidí jen potomci třídy private vidí jen třída sama implicitní práva: u class je to private, u struct je to public metody realizují princip posílání zpráv objekty jsou konkrétní instance tříd PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 26 / 39

int main() { LandUnit soldier1; // soldier1 je objekt soldier1.move(1, 1); } PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 27 / 39 Příklad třídy class LandUnit { private: // soukromé, není vidět z venku int x, y; public: // veřejné, je součástí veřejného rozhraní třídy void move(int targetx, int targety); // jen prototyp }; void LandUnit::move(int targetx, int targety) { //... kód pro pohyb jednotky... x = targetx; y = targety; }

Metody this skrytý parametr this: ukazatel na konkrétní objekt void LandUnit::move(int, int); // je jakoby void LandUnit::move(LandUnit * this, int, int); // není C++! soldier1.move(1, 1); // je jakoby LandUnit::move(&soldier1, 1, 1); použítí atributů uvnitř metod: místo x a y jsme mohli psát this->x a this->y // není C++! PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 28 / 39

Metody deklarace a definice deklarace a definice metod je možno psát odděleně uvnitř deklarace třídy class Person { private: int age; public: void setage(int age) { this->age = age; } int getage() { return age; } }; typické pro menší metody (getter/setter); jako by byly inline PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 29 / 39

Metody rozvržení do souborů Hlavičkový soubor *.h deklarace třídy inline metody Zdrojový soubor *.cpp definice (implementace) metod Zamyšlení: Co všechno patří k třídě? What s in a class? The interface principle http://gotw.ca/publications/mill02.html k třídě patří i volné funkce s danou třídou pracující PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 30 / 39

Konstruktor motivace: Jaká bude hodnota atributů při vytvoření objektu? PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 31 / 39

Konstruktor motivace: Jaká bude hodnota atributů při vytvoření objektu? Bude neinicializovaná. Jak to řešit? PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 31 / 39

Konstruktor motivace: Jaká bude hodnota atributů při vytvoření objektu? Bude neinicializovaná. Jak to řešit? neelegantní řešení: metoda pro inicializaci, kterou je třeba zavolat lepší řešení: konstruktor class LandUnit { int x, y; public: LandUnit(); LandUnit(int, int); }; LandUnit::LandUnit() { x = 0; y = 0; } LandUnit::LandUnit(int x, int y) { this->x = x; this->y = y; } int main() { LandUnit soldier1; LandUnit soldier2(17, 42); } PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 31 / 39

Konstruktor může být definován uvnitř deklarace třídy inicializační sekce konstruktoru inicializace atributů předání parametrů konstruktoru rodiče lepší způsob inicializace než přiřazení class LandUnit { //...jako předtím... LandUnit(int tx, int ty) : x(tx), y(ty) {} // všimněte si prázdného těla konstruktoru }; co když nedefinuju žádný konstruktor? defaultní konstruktor kopírovací konstruktor příště (používá reference) PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 32 / 39

Destruktor úklid objektu poté, co přestal existovat uvolnění paměti zavření souborů, ukončení spojení apod. automaticky volán při uvolňování objektu konec platnosti lokální proměnné po zavolání delete nemá žádné parametry, nelze jej přetěžovat, nevrací žádnou hodnotu syntaxe: ~jméno třídy() class LandUnit { //... virtual ~LandUnit(); }; LandUnit::~LandUnit() { // kód pro uvolnění paměti apod. } PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 33 / 39

Dědičnost třída může dědit od jiné třídy v této přednášce jen úplné základy, více si řekneme příště class Archer : public LandUnit { int range; public: Archer(int x, int y, int r) : LandUnit(x, y), range(r) {} void shootat(int x, int y); } nyní můžeme psát: Archer john(17, 42, 6); john.move(20, 15); // používáme zděděnou metodu john.shootat(20, 10); PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 34 / 39

Dědičnost (pokr.) ukazateli na předka můžeme předat potomka: LandUnit * unit = &john; unit->move(10, 7); unit->shootat(1, 1); // CHYBA! třída LandUnit nemá // metodu shootat polymorfismus: dejme tomu, že i třídy Swordsman a Knight jsou potomky LandUnit; potom můžeme psát: Swordsman joe(5, 5); Knight lancelot(7, 7); LandUnit * units[3] = { &john, &joe, &lancelot }; for (int i = 0; i < 3; ++i) { units[i]->move(i, 15); } PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 35 / 39

Pozdní vazba virtual class X { public: void metodaa(); virtual void metodab(); }; class Y : public X { public: void metodaa(); void metodab(); }; int main() { Y y; X * px = &y; px->metodaa(); // zavolá se X::metodaA(), časná vazba px->metodab(); // zavolá se Y::metodaB(), pozdní vazba } PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 36 / 39

Abstraktní třída abstraktní třída je třída, která neimplementuje nějakou metodu není možno vytvářet objekty abstraktní třídy class LandUnit { //... virtual void attack(int x, int y) = 0; }; void Archer::attack(int x, int y) { // kód pro útok } int main() { LandUnit soldier; // CHYBA! LandUnit * unit; // ukazatel na abstraktní třídu je v pořádku Archer john(9, 15); unit = &archer; unit->attack(10, 7); } PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 37 / 39

Shrnutí Objektově-orientované programování způsob návrhu řešení problémů pomocí rozdělení na víceméně autonomní celky objekty principy OOP: zapouzdření abstrakce dědičnost polymorfismus OOP v C++ třídy obsahují atributy (data), metody, konstruktory, destruktory, přístupová práva public, protected, private metody mají skrytý parametr this konstruktor slouží k inicializaci objektu destruktor slouží k úklidu PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 38 / 39

Samostudium na příští týden najděte si na http://cppreference.com dokumentaci k typu string a naučte se jej používat najděte si na http://cplusplus.com tutoriál Basic Input/Output a naučte se základy vstupu a výstupu v C++ dotazy na použití stringu mohou být součástí testíku na druhém cvičení, stejně tak i vstup a výstup pomocí cin a cout PB161 přednáška 1: organizace, úvod do OOP v C++ 21. září 2015 39 / 39