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

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

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

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

Více o konstruktorech a destruktorech

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

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

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

C++ objektově orientovaná nadstavba programovacího jazyka C

Pokročilé programování v jazyce C pro chemiky (C3220) Vstup a výstup v C++

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

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

Mělká a hluboká kopie

C++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Prostory jmen. #include<iostream.h> namespace RadimuvProstor { int secti(int a, int b); class Trida { private: int Atribut; public: void metoda();

10. března 2015, Brno Připravil: David Procházka. Programovací jazyk C++

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Funkční objekty v C++.

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

Jazyk C++ II. Šablony a implementace

Abstraktní třídy, polymorfní struktury

Připravil: David Procházka. Programovací jazyk C++

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

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

Soubor jako posloupnost bytů

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

Objektov orientované programování. C++ Akademie SH. 7. Objektov orientované programování. Michal Kvasni ka. Za áte níci C++ 2.

Generické programování

Výčtový typ strana 67

Z. Kotala, P. Toman: Java ( Obsah )

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

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

1. Programování proti rozhraní

Dědění, polymorfismus

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

Návrhové vzory. Jakub Klemsa, Jan Legerský. 30. října Objektově orientované programování.

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

Java - výjimky. private void vstup() throws IOException {... }

Konstruktory a destruktory

for (int i = 0; i < sizeof(hodnoty) / sizeof(int); i++) { cout<<hodonoty[i]<< endl; } cin.get(); return 0; }

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

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

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

KTE / ZPE Informační technologie

PREPROCESOR POKRAČOVÁNÍ

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

Pro kontrolu správného formátu hodnoty N použijeme metodu try-catch.

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

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

Jazyk C++ I. Šablony

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

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

Jazyk C++ I. Šablony 2

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

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

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

Zpracoval:

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

Dědičnost (inheritance)

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

Základy C++ I. Jan Hnilica Počítačové modelování 18

Dynamická identifikace typů v C++.

1 Nejkratší cesta grafem

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

Úvod do programovacích jazyků (Java)

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

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

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

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Zápis programu v jazyce C#

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

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Programování v C++ VI

Vector datový kontejner v C++.

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

Syntaxe vyjímek. #include <iostream> #include <string> using namespace std; // Trida vyjimek class Vyjimka { private:

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

Teoretické minimum z PJV

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

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Šablony, kontejnery a iterátory

Objektově orientované programování. Úvod

Jazyk C++ I. Polymorfismus

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í

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

Jazyk C# a platforma.net

Ukazatele, dynamická alokace

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

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

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

Úvod do programovacích jazyků (Java)

Programování v jazyce C pro chemiky (C2160) 12. Specifické problémy při vývoji vědeckého softwaru

Jazyk C++ I. Polymorfismus

Standardní algoritmy v C++.

Objektové programování

Množina v C++ (set, multiset).

Transkript:

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

Prostory jmen U programů mohou někdy nastat kolize mezi jmény (tříd, funkcí, globálních proměnných atd.) pokud v různých částech programu použijeme neúmyslně stejná jména. Podobné kolize nejčastěji nastávají mezi jmény použitými v knihovnách a jmény v programu Pokud používáme více knihoven, mohou také nastat konflikty jmen mezi knihovnami Uvedeným kolizím lze předejít použitím prostorů jmen (angl. namespaces) Prostor jmen deklarujeme následovně: namespace jmeno_prostoru deklarace proměnných, funkcí, tříd Přistupujeme-li ke jménu (třídy, proměnné, funkce) uzavřenému v daném jmenném prostoru z vnitřku tohoto prostoru, používáme jména přímo (tj. tak jako bychom jmené prostory nepoužívali) Přistupujeme-li ke jménu z oblasti mimo jmenný prostor v němž je uzavřeno, musíme před každým takovým jménem uvést jméno jmenného prostoru oddělené dvojtečkou: jmeno_prostoru::jmeno 2

Prostory jmen - příklad namespace mujprostor int mojepromenna = 0; // Definice globalni promenne // K promenne mojepromenna muzeme v nasledujici funkci pristupovat // primo, protoze je definovana ve stejnem jmennem prostoru void mojefunkce() mojepromenna = 8; class MojeTrida public: // K promenne mojepromenna a funkci mojefunkce() muzeme // pristupovat primo, protoze jsou definovany ve stejnem // jmennem prostoru jako tato trida void print() mojepromenna = 8; mojefunkce(); ; // Pro pristup ke jmenum ve jmennem prostoru musime uvest jmeno // tohoto prostoru (oddelene ::) pred kazdym jmenem z toho prostoru mujprostor::mojepromenna = 100; mujprostor::mojefunkce(); mujprostor::mojetrida test; test.print(); // K promenne test uz pristupujeme primo, protoze // neni definovana ve jmennem prostoru mujprostor 3

Deklarace using Pomocí klíčového slova using lze zpřístupnit některá jména z prostoru jmen tak abychom s nimi mohli pracovat přímo namespace mujprostor // Zde bude definovana promenna, funkce a trida jako na predchozi // strance // Nasledujici deklarace nam umozni pristupovat k promenne // mojepromenna primo bez uvadeni jmena prostoru using mujprostor::mojepromenna; mojepromenna = 100; // K ostatnim jmenum vsak muzime pristupovat stejne jako // v predchozim pripade mujprostor::mojefunkce(); mujprostor::mojetrida test; test.print(); 4

Deklarace using namespace Deklarace using namespace umožňuje zpřístupnit všechna jména z daného prostoru jmen namespace mujprostor // Zde bude definovana promenna, funkce a trida jako na predchozi // strance // Nasledujici deklarace nam umozni pristupovat ke vsem jmenum // z jmenneho prostoru mujprostor primo bez uvadeni jmena prostoru using namespace mujprostor; mojepromenna = 100; mojefunkce(); MojeTrida test; test.print(); 5

Jmenný prostor standardní knihovny std Všechny jména používaná ve standardní knihovně C++ jsou uzavřena ve jmenném prostoru std Chceme-li používat jména standardní knihovny musíme použít jeden z následujících přístupů: před každé jméno ze standardní knihovny uvést std:: pomocí deklarace using specifikovat jména která budeme používat zpřístupnit všechna jména ve jmenném prostoru std použitím deklarace using namespace std; Některé knihovny nemají jména uzavřena ve jm. prostoru (např. Qt) int value = 0; std::cout << "Vystup na obrazovku"; std::cin >> value; using std::cout; // Zpristupnime jmeno cout z jmenneho prostoru std cout << "Vystup na obrazovku"; // Zde jiz nemusime davat std:: std::cin >> value; // Zde porad musime davat std:: using namespace std; // Zpristupnime vsechna jmena z jmen. prostoru std cout << "Vystup na obrazovku"; // Zde nemusime davat std:: cin >> value; // Ani zde nemusime davat std:: 6

Výjimky v C++ V programu často nastanou chybové stavy, které vyžadují ukončení provádění kódu (např. opuštením funkce) a vhodnou reakci na vzniklou chybu (výpis chybové zprávy na obrazovku, uvolnění dynamicky alokované paměti a pod.) Chybové stavy často vznikají při práci se soubory (např. nelze zapisovat protože je disk plný), matematických operacích (pokus o dělení nulou) a ostatních situacích (např. předávané parametry obsahují hodnoty mimo přípustný rámec) Chybové stavy můžeme ošetřit pomocí běžných programátorských postupů, lepší řešení však nabízí použití tzv. výjimek jazyka C++ Oblast kódu ve které očekáváme možnost vzniku chybového stavu uzavřeme do bloku try a uvnitř bloku v případě chyby vyvoláme vyjímku pomocí throw parametr_chyby Vzniklé výjimky zachytáváme v jednom nebo více blocích catch, které následují ihned za blokem try Výjimky patří mezi pokročilejší programovací techniky a jsou určeny pro zkušenější programátory Více na: http://www.cplusplus.com/doc/tutorial/exceptions/ 7

Výjimky v C++ - příklad ifstream ifile; try ifile.open("test.dat"); if (ifile.fail()) throw 20; // Nejaky dalsi kod catch (int e) cout << "Chyba cislo: " << e << endl; 8

Implicitní a explicitní konverze typů V jazyce C++ (a také C) můžeme proměnné jednoho typu přiřadit proměnnou jiného typu, při tom dojde k tzv. konverzi typu. V případě, kdy konverze typu nemůže způsobit ztrátu dat, je konverze prováděná překladačem automaticky, jedná se o implicitní konverzi Pokud při konverzi dochází ke změně konvertované hodnoty (např. zaokrouhlení nebo ořezání) je třeba explicitně specifikovat, že chceme tuto konverzi provést, jedná se o explicitní konverzi int a; double d; d = a; // Implicitnní konverze promenne typu int na double a = (int)d; // Explicitni konverze double na int (pri ni dochazi // k zaokrouhlovani smerem dolu) 9

Konverze u objektových typů U objektových typů používáme přetypování hlavně v souvislosti s ukazateli Implicitně lze přetypovat ukazatel třídy na ukazatel jeho základní třídy Při přetypování opačným směrem (ze základní třídy na odvozenou) musíme použít explicitní přetypování. Toto však možné udělat pouze v případě kdy ukazatel ukazuje na typ třídy na kterou přetypováváme (popř. některý z jeho předků). class Circle : public Graphic... Circle *circle1 = new Circle(); Circle *circle2 = 0; Graphic *graphic1 = 0; graphic1 = circle1; // Implicitni konverze na zakladni tridu circle2 = (Circle*) graphic1; // Explicitni konverze ze zakladni // tridy na odvozenou 10

Dynamická konverze typu Dynamická konverze typu se používá při přetypování z typu základní třídy na typ odvozené třídy, přitom však dochází k automatické kontrole přípustnosti této konverze, tj. zdali ukazatel skutečně ukazuje na objekt té třídy na niž chcem konvertovat. Pokud to není splněno, dojde při konverzi k nastavení ukazatele na 0. class Circle : public Graphic... Circle *circle1 = 0; Circle *circle2 = 0; Graphic *graphic1 = new Circle(); Graphic *graphic2 = new Graphic(); circle1 = dynamic_cast<circle*>(graphic1); // Uspesna konverze if (circle1!= 0) cout << Konverze byla uspesna << endl; circle2 = dynamic_cast<circle*>(graphic2); //Neuspesna konverze if (circle2 == 0) cout << Konverze nebyla uspesna << endl; 11

Návrhové vzory Návrhové vzory (angl. design patterns) jsou soubory řešení zaměřených na některé často se vyskytující situace při vývoji programu Návrhové vzory využívají principů objektového programování a bývají obecně použitelné v rámci různých objektově orientovaných programovacích jazyků (tedy nikoliv pouze C++) V současnosti je používáno 24 základních návrhových vzorů, byly však navrženy i další Další informace: http://en.wikipedia.org/wiki/software_design_pattern http://www.oodesign.com/ 12

Návrhový vzor Singleton Vzor Singleton (Jedináček) se používá při návrhu tříd, které mají vytvářet pouze jednu instanci (typicky např. třída Application) class Singleton public: static Singleton getinstance() if (instance == 0) instance = new Singleton(); return instance; ; private: static Singleton *instance; Singleton() instance = 0; Singleton *singl = Singleton::getInstance(); 13