Objektově orientované programování

Содержание

Слайд 2

Zápočet Zdrojové kódy v minimálním rozsahu 1500 řádků, doporučeno 2500 řádků.

Zápočet
Zdrojové kódy v minimálním rozsahu 1500 řádků, doporučeno 2500 řádků.
Nejlépe: Vlastní

ucelený příklad, který něco rozumného dělá
Vlastní jednoduché příklady, zadání může být z knihy
Nejhůře: Příklady probírané na cvičení
PS: Aktivní účast na cvičeních (8 účastí z 12 možných)
KS: Aktivní účast na soustředěních, 4 účasti z 9 možných)
Chybějící účast (pod stanovený limit) lze nahradit:
PS: +200 řádků zdrojových kódů za 1 hodinu neúčasti
KS: +400 řádků zdrojových kódů za 1 neúčast na soustředění. Pozor v jeden den bývají obvykle 2 až 3 soustředění)
Příklad: PS student X se zúčastnil jedné hodiny cvičení. Na zápočet odevzdá 1500 + (8 – 1)*200 = 2900 řádků zdrojových kódů.
Příklad: KS student Y se zúčastnil pouze výuky 1.4.2015 kdy proběhly 2 hodiny soustředění. Na zápočet odevzdá 1500 + (4 – 2)*400 = 2300 řádků zdrojového kódu.
Слайд 3

Zkouška Diskuze nad zdrojovými kódy předloženými k získání zápočtu. Zkušební okruhy

Zkouška
Diskuze nad zdrojovými kódy předloženými k získání zápočtu.
Zkušební okruhy
Reference jako parametr

funkce a návratová hodnota
Přetěžování funkcí a operátorů, new a delete
Bezparametrický konstruktor, copy konstruktor, operator =, destruktor
Dědičnost, Virtuální funkce, abstraktní třídy
Prostory jmen
Streamy, práce se soubory
Šablony funkcí a tříd
STL kontejnery, iterátory a algoritmy
Výjimky
Слайд 4

Literatura Miroslav Virius: Programování v C++ Miroslav Virius: Pasti a propasti

Literatura
Miroslav Virius: Programování v C++
Miroslav Virius: Pasti a propasti jazyka C++
Miroslav

Virius: Od C k C++
Scott Meyers: Effective C++, More Effective C++, Effective STL
Herb Sutter: Exceptional C++, More Exceptional C++
Que: ANSI/ISO C++ Professional Programmer's Handbook
Bruce Eckel: Myslíme v jazyce C++
James O. Coplien: Advanced C++ Programming Styles and Idioms
Bjarne Stroustrup: The C++ Programming Language
ISO/IEC 14882, ANSI: Programming languages - C++ (1998, 2003)
Слайд 5

ZS (PJC) LS (OOP) Obsah předmětu C C C++ C++ Paradigmata

ZS (PJC) LS (OOP)

Obsah předmětu

C

C

C++

C++

Paradigmata programování, OOP
Objekty, zapouzdření, dědičnost, konstruktory

a destruktory
Přetěžování funkcí, předefinování operátorů
Pozdní vazba, virtuální funkce
Abstraktní datové typy
Šablony, výjimky, prostory jmen.
Objektové knihovny: streams, STL
RTTI, OO styly a idiomy...
Слайд 6

Procedurální programování jakou akci mám provést vstup – výpočet (algoritmus) –

Procedurální programování
jakou akci mám provést
vstup – výpočet (algoritmus) – výstup
black box:

procedura / funkce
Modulární programování
rozdělení problému na komponenty
procedury pracují nad daty - rozhraní
black box: modul
Datová abstrakce
vytvoření vlastního datového typu (abstract/user defined datové typy)
kompletní množina operací nad tímto typem
black box: datový typ
Objektové programování
dědičnost – obecné / konkrétní vlastnosti
Polymorfismus – odlišné chování potomků
možnost pozdějších rozšíření
zapouzdření

Paradigmata programování

Слайд 7

Koncepční pohled objekt: entita reagující na vnější podněty třída: množina stejně

Koncepční pohled
objekt: entita reagující na vnější podněty
třída: množina stejně reagujících entit
Technický

pohled
objekt: struktura obsahující data a funkce, instance třídy (proměnná)
třída: typ objektu – jednotná struktura dat, stejné operace nad daty
Zobecnění pojmu struktura (struct)
Rozdíl mezi class a struct v C++ je nepatrný, užívání class je pouze konvence
deklarace třídy obsahuje
Deklarace datových položek (stejně jako v C)
Funkce (metody), virtuální funkce a statické funkce
Definice výčtových konstant a typů (včetně vnořených tříd)
Rozhraní – veřejné informace a služby pro uživatele
Implementace – (neveřejná) interní data a metody (funkce)

Třídy a objekty

Слайд 8

Třída zvíře v C++ - rozhraní vnitřní stav (privátní) rozhraní (veřejné)


Třída zvíře v C++ - rozhraní

vnitřní stav
(privátní)

rozhraní
(veřejné)

metody

zvire.h

konstruktor
(inicializace)

inline tělo funkce

Datová položka

Deklarace

metody
Слайд 9

Třída zvíře - implementace zvire.h zvire.cpp Třída metody :: operátor kvalifikace


Třída zvíře - implementace

zvire.h

zvire.cpp

Třída metody

:: operátor kvalifikace

Implementace (tělo) metody

Přístup k

datům metody

Středník !!!

Слайд 10

Třída zvíře - použití zvire.h mujprogram.cpp Import rozhraní Automatický konstruktor Instance


Třída zvíře - použití

zvire.h

mujprogram.cpp

Import rozhraní

Automatický konstruktor

Instance třídy = objekt

zaludek =

1

zaludek = 6

zaludek = 3

Слайд 11

Objekt - instance třídy pytlik: beruska: ? Metoda třídy - ke kterému objektu má přistupovat?


Objekt - instance třídy

pytlik:

beruska:

?

Metoda třídy - ke kterému objektu má

přistupovat?
Слайд 12

this pytlik: beruska: this C C++ Každá metoda dostane 'tajný' parametr


this

pytlik:

beruska:

this

C

C++

Každá metoda dostane 'tajný' parametr this – ukazatel na objekt

zvire::

znamena zvire * this

this->zije()

this->zaludek

Слайд 13

Reference x: :px y: :ry x: :a y: :b


Reference

x:

:px

y:

:ry

x:

:a

y:

:b

Слайд 14

Přetěžování funkcí


Přetěžování funkcí

Слайд 15

Implicitní parametry


Implicitní parametry

Слайд 16

Konstruktory Konstruktor s parametry Implicitní konstruktor bez parametrů Copy konstruktor X


Konstruktory

Konstruktor s parametry

Implicitní konstruktor
bez parametrů

Copy konstruktor X (const X&)
vytvoří

objekt jako kopii jiného
Слайд 17

Konstruktor s parametry Tímto zakážeme deklarovat objekt bez použití NEimplicitního konstruktoru


Konstruktor s parametry

Tímto zakážeme deklarovat objekt bez použití NEimplicitního konstruktoru

Nejde,

zakázali jsme

Využití
Předání nastavení objektu
Šetří řádky kódu
Zakázat implicitiní konstruktor
Dobře rozvážit zda zakázat
Bezpečnost proti nezadání klíčové hodnoty
identifikátor

Слайд 18

Přetěžování operátorů - deklarace


Přetěžování operátorů - deklarace

Слайд 19

Přetěžování operátorů – těla metod


Přetěžování operátorů – těla metod

Слайд 20

Přetěžování operátorů - pravidla Většinu operátorů jazyka C++ lze definovat pro

Přetěžování operátorů - pravidla

Většinu operátorů jazyka C++ lze definovat pro uživatelské

datové typy
Nelze předefinovat tyto operátory: .  .*  ::   ? :  sizeof
Alespoň jeden z operandů musí být třída nebo výčtový typ nebo reference na ně
Nelze předefinovat operace na číselných typech a ukazatelích
Předefinováním nelze měnit prioritu a asociativitu operátorů
Pro předefinované operátory nemusí platit identity definované pro základní typy
++a nemusí být ekvivalentní a=a+1
a[b] nemusí být ekvivalentní *(a+b) ani b[a]
je však velmi doporučeno dodržovat běžnou sémantiku
Pro předefinované operátory && a || neplatí pravidla o zkráceném vyhodnocování
Typy skutečných operandů nemusejí přesně odpovídat typům formálních parametrů
stejná pravidla jako pro přetížené funkce
Слайд 21

Pozor! Pro předefinované operátory nemusí platit identity definované pro základní typy:

Pozor! Pro předefinované operátory nemusí platit identity definované pro základní typy:
a=a+b

≠ a+=b a[b] ≠ *(a+b)

Přetěžování operátorů – ekvivalence

Слайд 22

copy konstruktor a operator=


copy konstruktor a operator=

Слайд 23

Udržovatelnost kódu Těla operátorů a konstruktorů volání jiné funkce Public část

Udržovatelnost kódu

Těla operátorů a konstruktorů
volání jiné funkce
Public část před private
Private položky

nejsou zajímavé
Datové položky vždy private
Funkce Get a Set
Těla metod vždy v *.cpp souboru
Pro pozdější rozšíření
Lépe se hledá kde je implementované
Jména tříd
ToJeMojeTrida
Jména funkcí proměnných
mojePrvniFunkce
Слайд 24

C++ odlišuje objekt a ukazatel na něj Rozdíl oproti jiným jazykům

C++ odlišuje objekt a ukazatel na něj
Rozdíl oproti jiným jazykům
Java, JavaScript,

PHP, VisualBasic, ...
Analogie s chováním stuct v C
Ukazatel nelze použít dokud není splněna jedna z možností:
Přiřazen existující objekt
Reference
Dynamicky vytvořen nový objekt
Operátor new

Objekt a ukazatel na objekt

Nevzniká tu žádný objekt

vzniká nový objekt

Слайд 25

Operátory new a delete


Operátory new a delete

Слайд 26

Chytré řetězce – nápad


Chytré řetězce – nápad

Слайд 27

Chytré řetězce - třída operace s řetězci Konstantní funkce, nemodifikuje objekt

Chytré řetězce - třída

operace s řetězci

Konstantní funkce, nemodifikuje objekt

Слайд 28

Destruktory


Destruktory

Слайд 29

Vyvolání destruktoru


Vyvolání destruktoru

Слайд 30

Řetězce – implementace

Řetězce – implementace

Слайд 31

O něco lepší implementace !!! buf = 0; nebo private !!!

O něco lepší implementace


!!! buf = 0; nebo private !!!

Слайд 32

Implementace kopírování Jde clear() přidat do copy() ???

Implementace kopírování


Jde clear() přidat do copy() ???

Слайд 33

Zřetězení

Zřetězení


Слайд 34

Připojení řetězce

Připojení řetězce


Слайд 35

Str a jednotlivé znaky

Str a jednotlivé znaky


Слайд 36

Výstup

Výstup


Слайд 37

... and together

... and together


Слайд 38

vztah tříd předek-potomek – hierarchie přesnější názvosloví: základní (base) / odvozená

vztah tříd předek-potomek – hierarchie
přesnější názvosloví: základní (base) / odvozená třída

(derived class)
vícenásobná dědičnost
dvakrát měř, jednou řež, protokoly
specializace
potomek má/umí něco navíc
reusabilita
jiné chování bez změny původní třídy

Dědičnost

jez, vyměšuj

sedni, lehni

trhej

uč_se

Слайд 39

pes jako potomek zvířete - definice jez, vyměšuj sedni Přístup pro třídu a potomky


pes jako potomek zvířete - definice

jez, vyměšuj

sedni

Přístup pro třídu a

potomky
Слайд 40

Konstruktor a destruktor předka


Konstruktor a destruktor předka

Слайд 41

Potomka lze přiřadit do předka (platí i pro ukazatele) Předka NELZE

Potomka lze přiřadit do předka (platí i pro ukazatele)
Předka NELZE přiřadit

do potomka (platí i pro ukazatele)

Kompatibilita předka a potomka

azor

pytlik

pytlik

azor

???

Слайд 42

odlišné chování potomků – pozdní vazba (late binding) Polymorfismus jez jez jez jez

odlišné chování potomků – pozdní vazba (late binding)

Polymorfismus

jez

jez

jez

jez

Слайд 43

Polymorfismus - motivace


Polymorfismus - motivace

Слайд 44

Polymorfismus – takto nelze


Polymorfismus – takto nelze

Слайд 45

Polymorfismus – takto bych to chtěl


Polymorfismus – takto bych to chtěl

Слайд 46

Virtuální funkce - deklarace


Virtuální funkce - deklarace

Слайд 47

Virtuální funkce - implementace Pes Zvire z = new Zvire; z


Virtuální funkce - implementace

Pes

Zvire

z = new Zvire;

z = new Pes;

Zvire

* z;

z->jez();

Слайд 48

Virtuální funkce a konstruktory a destruktory


Virtuální funkce a konstruktory a destruktory

Слайд 49

Volání virtuálních funkcí b paa a pab pbb


Volání virtuálních funkcí

b

paa

a

pab

pbb

Слайд 50

Abstraktní třída, čistě virtuální funkce


Abstraktní třída, čistě virtuální funkce

Слайд 51

Abstraktní třídy, virtuální destruktory


Abstraktní třídy, virtuální destruktory

Слайд 52

Nesprávné užití dědičnosti Letadlo není potomkem svého motoru Důkaz: Co když

Nesprávné užití dědičnosti

Letadlo není potomkem svého motoru
Důkaz: Co když má dva

motory...
Násobná dědičnost? Ne: Je třeba je odlišit
Jezevčík umí vyhnat lišku z nory...
Myslivec s jezevčíkem tedy také...
Myslivec není potomkem svého jezevčíka
Důkaz: Nežere granule...
Kompozice? Ne: Nerodí se zároveň
Mlok není potomkem ryby a savce
Důkaz: Nemá dvě hlavy...
Virtuální dědičnost? Ne: Nekojí
Tlačítko není potomkem obdélníku a textu
Слайд 53

Prostory jmen (namespaces)


Prostory jmen (namespaces)

Слайд 54

Prostory jmen


Prostory jmen

Слайд 55

Prostory jmen a standardní knihovny


Prostory jmen a standardní knihovny

Слайд 56

Vstup a výstup - proudy (streams)


Vstup a výstup - proudy (streams)

Слайд 57

Streams – hierarchie tříd


Streams – hierarchie tříd

Слайд 58

Hlavičkové soubory


Hlavičkové soubory

Слайд 59

Manipulátory


Manipulátory

Слайд 60

Výstup do souboru


Výstup do souboru

Слайд 61

Další metody vstupních proudů


Další metody vstupních proudů

Слайд 62

Spřátelené funkce – vlastní výstup


Spřátelené funkce – vlastní výstup

Слайд 63

Šablony


Šablony

Слайд 64

Šablony tříd - definice


Šablony tříd - definice

Слайд 65

Šablony metod, instance šablon


Šablony metod, instance šablon

Слайд 66

STL – Standard Template Library


STL – Standard Template Library

Слайд 67

STL – kontejnery


STL – kontejnery

Слайд 68

STL – kontejnery


STL – kontejnery

Слайд 69

STL – iterátory a metody kontejnerů


STL – iterátory a metody kontejnerů

Слайд 70

STL – použití iterátorů


STL – použití iterátorů

Слайд 71

STL – použití asociativního pole ts:


STL – použití asociativního pole

ts:

Слайд 72

STL – algoritmy


STL – algoritmy

Слайд 73

STL – použití algoritmů


STL – použití algoritmů

Слайд 74

STL – chybová hlášení


STL – chybová hlášení

Слайд 75

string

string


Слайд 76

Výjimky


Výjimky

Слайд 77

Výjimky - jednoduchý příklad


Výjimky - jednoduchý příklad

Слайд 78

Výjimky - jednoduchý příklad


Výjimky - jednoduchý příklad

Слайд 79

Výjimky - pravidla


Výjimky - pravidla

Слайд 80

Specifikace výjimek funkcí


Specifikace výjimek funkcí

Слайд 81

... co jsme neprobrali

... co jsme neprobrali