Programovací jazyk C++

Rozměr: px
Začít zobrazení ze stránky:

Download "Programovací jazyk C++"

Transkript

1 Programovací jazyk C++ Jiří Fišer KI PřF UJEP presentace pro kurs Programování III (s předpokládanou znalostí jazyka C#) MXMVIII 1

2 Základní charakteristika 2 programovací jazyk C++ je objektovým rozšířením jazyka C a je s ním do značné zpětně kompatibilní, kód v jazyce C je tedy i platným kódem jazyka C++ (výjimkou jsou pouze zastaralé konstrukce jazyka C resp. naopak konstrukce nové verze jazyka C ISO 1999) styl programování se ovšem podstatně liší nebo: v C++ jsou preferovány OOP konstrukce C++ má vlastní standardní knihovnu na vyšší úrovni abstrakce než tomu bylo v C (C knihovnu je však nadále použitelná) C++ je velmi komplexní a složitý programovací jazyk (zvládnutí celého jazyka je práce na mnoho let)

3 Výhody a nevýhody [+] jazyk C++ je jazykem velkého množství softwarových projektů, především v oblasti základních aplikací a komplexních softwarových systémů [+] vyjadřovací síla jazyka je značná a to na všech úrovních abstrakce (od přímé zprávy k paměti k abstraktním konstrukcím) [+] v C++ lze psát prostorově i časově efektivní programy (rychlé s malými nároky na paměť) [-+] jazyk nenabízí automatickou správu paměti [garbage collector]. Časté jsou neplatné přístupy k paměti či její úniky [-] standardní knihovna C++ je velmi omezená. Mnohé oblasti (sítě, GUI, databáze, XML, apod.) nepodporuje [-] jazyk nepodporuje reflexi ( obtížná podpora GUI komponent) 3

4 Stručná historie jazyka 1980 : vzniká C with Classes, prvotní verze jazyka (Stroustrup) 1983 : název C++ a dostupnost prvního kompilátoru (Cfront) 1985 : vydání knihy The C++ Programming Language 1990: začátek standardizačního procesu 1998: ISO standard jazyka ISO/IEC 14882: : většina překladačů téměř podporuje ISO standard (většinou však nikoliv v základním režimu, některé prvky nebyly v zásadě akceptovány) 2005: Technical Report 1 (knihovní rozšíření, nejsou povinné) 2009?: nová verze jazyka 4

5 C++ a.net C# a C++ jsou si velmi podobné na úrovni syntaxe (C# převzalo mnohé rysy syntaxe jazyka C i C++) podobnost na úrovni sémantiky je však výrazně menší (C# je v tomto ohledu více podobné Javě či ostatním.net jazykům jako Visual Basic nebo Boo) kromě paměťového modelu se výrazně liší model modularity (ta je založena na textové substituci a linkování knihoven, nikoliv na samopopisných assembly), model šablon (=generik) (ten není na jedné stranu propojen s objektovým modelem, na stranu druhou je mnohem pružnější a tvoří de facto vlastní jazyk) v.net existuje i rozšíření jazyka C++ tzv. C++/CLI. To je do značné míry kompatibilní s ISO C++, má však mnohá rozšíření pro kompatibilitu s CLR a CLS (výrazně složitější) 5

6 C# a C++ - shody jazyk C++ se shoduje (resp. téměř shoduje) s jazykem C# v následujících oblastech (převzatých z jazyka C) základní programové konstrukce: if, while, for, break, continue, return (ale chybí) aritmetické, relační a logické operace, přiřazení (včetně složeného a inkrementací) definice proměnných jednoduchých číselných typů a jejich literály základní objektový model: datové členy, metody, základní přístupová práva (public, private). 6

7 Hello, world v C++ program Hello, world lze napsat v C++ mnoha způsoby (lze např. použít i jeho klasickou C verzi). #include<iostream> using namespace std; int main() { } cout << "Hello, world" << endl; return 0; textové vložení hlavičkového souboru s deklaracemi tříd, funkcí, proměnných apod. import jmenného prostoru (std je jediný standardní jmenný prostor) výpis do std. vstupu (s přetíženou verzí operátoru bit. posunu) hlavička hlavní funkce programu (neobjektová konstrukce) jazyk C se nezapře 7

8 Elementární datové typy základní systém datových typů se neliší od C# (bool, int, double, float) u speciálnějších typů však rozdíly existují. V C++ navíc nemají mnohé číselné typy přesně definované MPH: char : číselný typ (!!) 1-bytový (odpovídá nejčastěji sbyte) [signed] short [int] : znaménkový (nejčastěji 2-bytový) unsigned short [int]: neznaménkový (nejčastěji 2-bytový) [signed] int: znaménkový (nejčastěji 4-bytový) unsigned [int]: neznaménkový (nejčastěji 4 bytový) [signed] long [int]: znaménkový (nejčastěji 4 bytový) řetězec: std::string - ne zcela plnohodnotný typ bez podpory Unicode (jen ASCII) 8

9 Třídy 9 základní zápis tříd se příliš neliší od C# (podporovány však nejsou vlastnosti, vše co souvisí s assembly apod.). class Zlomek { private: int _citatel; int _jmenovatel; public: Zlomek(int c=0, int j=1) }; sekce přístupu (vše v dané sekci má daný přístup) zde nepovinné, neboť private je implicitní sekce implicitní hodnoty parametrů definují jedním zápisem více přetížených metod volání (pseudo)konstruktorů podobjektů : _citatel(c), _jmenovatel(j) {} Zlomek soucin(zlomek z) { return Zlomek(_citatel * z._citatel, jmenovatel * z._jmenovatel); } void setcitatel(int c) {_citatel = c;} int citatel() const {return _citatel;} středník!!! označení konstantnosti metody (metoda nemění adresáta = this)

10 Třídy jako hodnotové typy I 10 třídy jsou v jazyce C++ implicitně hodnotovými typy, tj. jejich instance (=objekty) jsou uloženy přímo na zásobníku (lokální automatické proměnné) nebo ve statické paměti (globální proměnné). [struct v C#] výhody: objekty automaticky zanikají po opuštění oboru viditelnosti (scope) jejich proměnných (uvolnění paměti) objekty lze snadno duplikovat (kopírovací konstruktor) a přiřazovat (přiřazovací operátor) nevýhody: při předávání (parametry, návratové hodnoty) se musí kopírovat celý objekt (řešení: reference) není podporován obj. polymorfismus (objekty musí být typovány skutečnými typy) (řešení: dyn. alokace a ukazatele, reference)

11 Třídy jako hodnotové typy II definice proměnných Zlomek z; //použije se bezparametrický konstruktor Zlomek x (2); //použije se verze s jedním parametrem Zlomek y (1, 2); Zlomek t = z; //použije se kopírovací konstruktor x = z; //zde se ale použije se přiřazovací operátor kopírovací konstruktor a přiřazovací operátor se nemusí explicitně implementovat (překladač automaticky generuje verze provádějící kopírování byt po bytu) definici tohoto typu lze použít pro: 1) automatické lokální proměnné, 2) parametry (jsou předávány hodnotou), 3) statické globální proměnné, 4) datové členy 11

12 Definice metod mimo těla třídy I definice metod přímo v těle třídy se používá pouze pro velmi jednoduché metody (ty jsou pak rozvíjeny přímo do kódu = inline metody) u ostatních metod se metody implementují (definují) mimo těla třídy navíc v jiném zdrojovém souboru. deklarace tříd (a deklarace globálních funkcí a proměnných) se uvádí v tzv. hlavičkovém souboru (s příponou.h) tento soubor poskytuje primárně rozhraní třídy (i když obsahuje i definice datových členů) implementace tříd (a globálních funkcí + definice globálních proměnných) je ve zdrojovém souboru s příponou.cpp (resp. cc, cpp, cp, c++) 12

13 Definice metod mimo těla třídy II 13 hlavičkový soubor: zlomek.h class Zlomek {... public: Zlomek(int citatel=0, int jmenovatel = 1); void zkrat(); }; implementační soubor: zlomek.cpp #include"zlomek.h" kvalifikace jménem třídy oddělovačem je vždy čtyřtečka Zlomek::Zlomek(int citatel, int jmenovatel) : _citatel(citatel), _jmenovatel(jmenovatel) {this->zkrat();} void Zlomek::zkrat() {...} deklarace konstruktoru (bez těla jen se signaturou ) deklarace metody vložení (textu) hlavičkového souboru nutné (jinak by nebyla známa dekl. třídy) implicit. hodnoty parametrů se neopakují!! kvalifikace objektem this (nepov.) this je ukazatel proto ->, nikoliv tečka

14 Statické datové členy a metody statické datové členy a statické metody mají podobnou funkci jako v C# = umožňují definovat data (resp. konstanty) a metody na úrovni tříd class Zlomek { static Zlomek zero; }; nelze inicializovat přímo ve třídě (deklarace) nutno při definici (v impl. souboru) static bool compare(zlomek a, Zlomek b); Zlomek Zlomek::Zero = Zlomek(0,1); bool Zlomek::compare(Zlomek a, Zlomek b) { } přístup ke statickým členům z vnějšku (kvalifikace třídou) Zlomek::Zero, Zlomek::compare(x, y) 14

15 Reference reference umožňují snadné předávání parametrů referencí (odkazem) v zásadě jsou to proměnné obsahující odkaz na hodnotu. Reference musí po dobu své existence odkazovat na stejný paměťový objekt, odkazovaná hodnota se však může měnit (a tím i identita OOP objektu) předávání odkazem se používá 1) pro výstupní a vstupně výstupní proměnné odkazované paměťové místo se v tomto případě mění (výstupní parametry se používají zřídka, podobně jako v C# parametry se specifikátorem ref nebo out) 2) pro efektivnější předávání hodnot (bez kopírování) používá se téměř důsledně pro všechny neelementární typy 15

16 Reference II reference pro výstupní parametry void Zlomek::VratSmíšenýTvar (int& celacast, Zlomek& zlomkovacast) const {... celacast =...; zlomkovacast = Zlomek(...); } neinicializovaná proměnná (!!) volání: int i; Zlomek zc; z.vratsmisenytvar(i, zc); cout << i; přímý přístup k odkazované hodnotě (ta je přiřazením změněna) zde musí být označení paměťového místa (tzv. l-hodnota), to je v rámci postranního efektu metody změněno 16

17 Reference III použití reference pro efektivnější předání vstupního parametru Zlomek soucet(const Zlomek& operand) const {...} reference na konstantní objekt třídy Zlomek překladač kontroluje neměnnost odkazované hodnoty. Do objektu nesmí být přiřazováno, nesmí být přímo měněn jeho (veřejný) datový člen a především na něj nesmí být volána nekonstantní metoda (bez const za seznamem parametrů) a nesmí být předáván nekonstantní referencí do dalších metod => nutnost důsledného používání const u metod a referencí volání: z.soucet(x), ale i z.soucet(zlomek(1,2)) 17

18 Reference IV reference však lze i vracet jako návratové hodnoty metod a to opět nejčastěji z důvodů eliminaci kopírování hodnot vrácená reference musí odkazovat na objekt, který existuje i po ukončení metody!!! tj. lze vrátit jen referenci na adresáta (this), resp, referenci předanou jako parametr (typicky konstantní) nelze vrátit referenci na objekt v lokální proměnné, parametru předaném hodnotou resp. na anonymní hodnotu Zlomek& Přičti(const Zlomek& inkrement) { _citatel += inkrement._citatel; chybí const return *this; (metoda není konstantní!) } operátor vracející objekt, na nějž ukazuje ukazatel, vrácená reference ukazuje na takto získaný objekt 18

19 Konstantní vers. nekonstantní u některých typů metod existují dvě základní alternativy implementace: konstantní metody vracející výsledek jako nový objekt (např. Secti) při vícenásobném použití neefektivní (vždy je vytvářen nový dočasný objekt) bezpečnější při používání (žádné postranní efekty) jsou využitelné při předefinování běžných operátorů nekonstantní metody modifikující adresáta (a běžně vracející referenci na něj pro další řetězení) výrazně efektivnější (nedochází ke vzniku a zániku dočasných objektů) mohou vznikat nepříjemné efekty při chybném použití 19

20 Pole v jazyce C++ existují dva základní typy polí: statické pole [alokované na zásobníku nebo ve statické paměti] statické pole se snadněji používá a je automaticky destruováno velikost pole však musí být známa již v době překladu dynamické pole [alokované na hromadě] složitější alokace (i když přístup se následně již neliší) nutná explicitní dealokace (opomenutí = memory leak) velikost lze stanovit za běhu aplikace obě pole používají stejnou syntaxi při přístupu, nejsou však bohužel zaměnitelná (dealokace stat. pole vede k výjimce) 20

21 Statické pole I definice statického pole bázový-typ identifikátor [velikost] velikost musí být známa již při překladu tj. musí to být tzv. konstantní výraz 1) číselný literál (např. 2) 2) symbolická konstanta konst. výrazu (=textové makro) #define SIZE 2 3) konstantní proměnná inicializovaná konstantním výrazem (např. const int size = 2;) 4) numerický výraz jehož operandy jsou konstantní výrazy (např. 2 * SIZE + 1) 21

22 Statické pole II příklady definicí: int vektor [10], Zlomek posloupnost [SIZE] pro přístup ke statickému poli lze použít běžnou indexaci (první index je 0) vektor[0], vektor[9] jazyk C++ nekontroluje meze indexů, pokud je použit index mimo rozsah 0..SIZE-1 dostane se program do nedefinovaného stavu (porušení ochrany paměti, změna chování programu, apod) pole není objekt (nelze volat žádné metody) a nelze zjistit jeho velikost (např. ve funkci, jíž je pole předáno) 22

23 Ukazatel pro jazyk C++ stejně jako jazyk C je typický úzký vztah mezi ukazateli a poli ukazatel [pointer]= hodnota obsahující odkaz na paměťový objekt (= trvalejší hodnota) ukazatel lze chápat jako spojení paměťové adresy a informace o datovém typu odkazovaného objektu ukazatel 1 ukazatel 2 počáteční adresa paměťový objekt v jazyce C++ však mohou existovat ukazatele, které neukazují na alokovaný paměťový objekt (nejsou inicializovány, objekt na než ukazovaly zanikl, apod) 23

24 Ukazatel II hlavním problém jazyka C++ je právě možnost používání neplatných ukazatelů (výsledkem je nepříjemný nedefinovaný stav) dodržováním jistých zásad lze tento problém minimalizovat, nikoliv však zcela eliminovat definice proměné typu ukazatel bázový_typ* identifikátor např. int* p vznikne proměnná obsahující neinicializovaný ukazatel je proto nutná inicializace ukazatelem na objekt příslušného bázového typu jednou z možností inicializace je dynamická alokace polí 24

25 Reference a dereference pomocí referenčního operátoru můžeme získat ukazatel na libovolné paměťové místo označené proměnnou resp. l-výrazem: int i; int *p; p = &i; //p ukazuje na pam. místo proměnné i opakem reference je dereference získání l-hodnoty paměťového místa na něž odkazuje ukazatel *p = 0; //což je totéž jako : i = 0; (přímý přístup) při referenci i dereferenci hraje významnou roli bázový typ ukazatele (přetypování je možné, ale nebezpečné) 25

26 Pointerová aritmetika I pointerová aritmetika umožňuje získávat ukazatele ukazující na okolní objekty v poli základní pointerově aritmetickou operací je přičtení celého čísla k ukazateli: int *ptr, *nextptr; //inicializace ukazatele ptr nextptr = ptr + n; výsledkem je nový ukazatel odkazující paměťový objekt typu int ležící na adrese zvýšené o n*sizeof(int). pointerové operace má smysl používat jen nad souvislým polem hodnot bázového typu (zde lze nový ukazatel interpretovat jako posunutý o n-položek vpravo) další odvozené operace: ptr-n, ptr++, ptr--, ptr1-ptr2, apod. 26

27 Pointerová aritmetika II Hic sunt leones pole: int [3] Hic sunt leones iptr + 1 iptr (typu int*) iptr + 1 pole: char [12] bptr -1 bptr +1 bptr (typu char*)

28 Pole a ukazatel statické pole se ve většině kontextů interpretuje jako ukazatel na první položku pole int pole [10]; *pole = hodnota první položky = pole[0] *(pole+2) = pole[2]; indexaci lze tedy rozepsat pomocí ukazatelové aritmetiky, formální rozpis se však v praxi nepoužívá. Typičtější je kompletní transformace do ukazatelového přístupu: for(int *p=pole; *p; *p++ = 0); //klasický C-ideom hlavní výjimkou je výraz: &pole, který je typu int (*) [10] = ukazatel na pole deseti hodnoty typu int (nikoliv tedy int**) 28

29 Ukazatel a pole na druhou stranu lze na ukazatel aplikovat indexaci (tj. můžeme jej chápat jako ukazatel na první položku celého pole objektů bázového typu) indexy se převádějí na ukazatelové operace podle recipročního vztahu: ptr[index] = *(ptr + index) vždy je však nutno odlišovat ukazatel a pole na sémantické rovině. Hlavní rozdíly: ukazatel nemusí vždy odkazovat na celé pole hodnot bázového typu (nelze nijak ověřit na co skutečně odkazuje, není žádná kontrola mezí) proměnná typu pole není na rozdíl od ukazatelové proměnné modifikovatelná: pole++ (nelze) oproti ptr++ 29

30 Pole jako parametr I pokud se použije pole na místě skutečného parametru, je do funkce/metody předáno jako ukazatel na první položku pole (i zde se tedy použije běžná interpretace) odpovídající formální parametr musí tedy být typu ukazatel na bázový typ pole (resp. na konstantní bázový typ je-li parametr jen vstupní) jako další parametr (typu int) by měla být předána velikost pole (nelze ji z ukazatele zjistit), výjimkou je případ kdy je v poli explicitní zarážka (koncový prvek) double * suma (const double* v, int size); funkce přijímá jako vstupní parametr pole (nebo ukazatel ukazující na první položku souvislé oblasti paměti) a věří, že má size položek. Vrací součet prvků. 30

31 Pole jako parametr II definice funkce (s ukazatelovým přístupem, možný je i indexový [vyzkoušejte!]) double suma(const double* v, int size) { } double suma = 0; for(double *p = v; return suma; p-v < size; p++) suma += *p; volání funkce (N je symbolická konstanta literálu) double vektor [N]; cout << suma(vektor, N) << endl; 31

32 Dynamické pole I dynamické pole (přesněji dynamicky alokované pole) je dynamicky (=za běhu) alokovaná oblast paměti, k níž je přistupováno pomocí ukazatele podobně jako ke statickému poli bázový typ ukazatele určuje typ položek a musí se shodovat s typem určeným při alokaci. Velikost může být určena libovolným (tj. i nekonstantním výrazem), nelze ji však poté měnit. alokace dynamického pole (na pravé straně se podobá C#, vzniká však něco mnohem jednoduššího) long int* dp = new long int [100]; char* bytes = new char [size]; 32

33 Dynamické pole II použití dynamických polí přináší tři podstatné nevýhody: 1. stejně jako u konstantních polí se nekontrolují meze (ve skutečnosti se vše provádí v pointerové aritmetice a ta neověřuje, zda se posunuté ukazatele neocitli za hranicí pole mezi lvy) 2. dynamicky alokované pole musí být explicitně uvolněno. Zápis je jednoduchý, ale lze snadno zapomenout (především je-li pole vráceno funkcí/metodou). delete [] dp; //nemusí být zadána velikost pole 3. chybou je naopak vícenásobné uvolnění, uvolnění ukazatele ukazující na jiný než první prvek, uvolnění statického pole (vždy musíme vědět kdo pole tzv. vlastní) 33

34 Zapouzdření dynamického pole použití pole v aplikacích není tedy příliš robustní (tj. je tzv. error-prone). naštěstí lze pomocí OOP konstrukcí vytvořit mnohem komfortnější a bezpečnější implementaci pole (s rozhraním, které je nadmnožinou rozhraní původního pole) tato implementace bude využívat interně původního pole, zapouzdří je však do nového rozhraní (tj. bude fungovat jako adaptér) mírně se sice sníží efektivita (jak paměťová tak časová), ale u většiny operací se bude jednat jen o mírné zpomalení (problematické bude jen kopírování) pro zjednodušení bude pole omezeno na celočíselný typ položek (polymorfní verze je možná jen pomocí šablon) 34

35 Zapouzdření dynamického pole II shrnutí požadované funkčnosti: dynamická alokace (nikoliv však realokace, velikost se po vytvoření nemění) zjištění velikosti pole (s časovou složitostí O(1)) indexace s kontrolou mezí snadné předávání ve formě parametrů (návratové hodnoty) a přiřazování automatická dealokace po opuštění oblasti platnosti prvotní návrh datové representace objekt obsahující dvě položky: velikost pole (konstantní) ukazatel na dynamicky alokované pole 35

36 Referenční vers. hodnotové přiřazení 36 pro další diskusi nad datovou representací je nutné diskutovat implementaci přiřazení (resp. předávání) při hodnotovém přiřazení se při přiřazení vytvoří nová kopie dat pole (= alokace + kopírování pole data) výhody: hodnotová sémantika = elegantnější + bezpečnější nevýhody: velmi pomalé (lze řešit pomocí COW) při referenčním přiřazení se pouze přesměruje ukazatel na existující pole (nic se nekopíruje) nevýhody: referenční sémantika vede k sdílení polí = méně přehledné, více náchylné k chybám (pole není read-only) výhody: efektivnější, bližší původní sémantice (ale ne zcela, nelze snadno zajistit konstantnost u vstupních parametrů) z důvodů jednoduchosti (při zachování rozumné efektivity) zvolíme referenční sémantiku

37 Referenční přiřazení triviální implementace referenčního přiřazení A = B: takto příliš jednoduchá implementace však přináší jeden zásadní problém s uvolňováním paměti. problém: jaký objekt bude při vícenásobném odkazu uvolňovat sdílené pole (nelze zaručit pořadí uvolňování A a B) řešení (nejjednodušší): čítání počtu aktivních odkazů 37

38 Referenční přiřazení II referenční čítaní však poněkud zkomplikuje datový návrh (referenční čítač musí být součástí sdílené paměti) původní objekt (třídy DArray) nyní obsahuje jen ukazatel na sdílený objekt typu ShrArrayData, poskytuje však celé veřejné rozhraní. Rozhraní objektů ShrArrayData je neveřejné, objekty však nesou však většinu informací: velikost pole, odkaz na vlastní data i aktuální počet odkazů na sdílený objekt (po jeho poklesu k nule může být objekt destruován) 38

39 ShrArrayData - deklarace deklarace pomocné třídy (sdílené pole) class ShrArrayData { int size; int refs; int* data; public: ShrArrayData(int size); }; void acquire() {refs++; totalrefs++;} bool release(); int length() const {return size;} int& getitemref(int index); static int totalrefs; voláno při zvýšení počtu odkazů (triviální, počet odkazů není omezen) voláno při snížení počtu odkazů pokud klesne na nulu je vráceno true pole rušící odkaz pak musí uvolnit objekt ShrArrayData vrací referenci na položku pole (lze pak použít i na pravé straně přiřazení) pro účely testování (celkový počet aktivních odkazů). Musí být po skončení programu roven 0! 39

40 ShrArrayData - metody implementace základních metod není složitá (trochu jí komplikují jen vstupní podmínky - aserce) bool ShrArrayData::release() { assert(refs > 0, "[RELEASE] refs == 0 before release"); refs--;totalrefs--; if(refs == 0) { delete [] data; return true; //object must be externally deleted } else return false; } 40 int& ShrArrayData::getItemRef(int index) { assert(index >= 0 && index < size, "[ITEMREF] index out of range"); return data[index]; }

41 ShrArrayData - konstruktor nepříliš složitá je i implementace konstruktoru (je jen jediný s parametrem určujícím požadovanou délku pole) i zde jsou využity aserce (výrazně usnadňují ladění), v případě problémů s alokací by bylo asi vyhození výjimky (není to programová chyba) ShrArrayData::ShrArrayData(int size) { assert(size>0, "[ARRAY ALLOC] NOT size > 0"); this->size = size; this->refs = 0; acquire(); this->data = new int[size]; po vytvoření je objekt ihned jedenkrát odkazován (!! nepříliš vhodné řešení) assert(size!= 0, "[ARRAY ALLOC] memory exhausted"); } 41

42 DArray - základní návrh I 42 třída DArray se zaměřuje především na správu sdíleného obsahu (jeho vytváření a rušení). Dosažení bezpečné (referenční) sémantiky je zajištěno čtveřicí speciálních metod: Tato čtveřice speciálních metod je povinná u všech objektů, které obsahují odkaz na data mimo ně (náš příklad), resp. zapouzdřují prostředek operačního sytému. generující konstruktor - vytváří nový objekt s novým obsahem (= objektem ShrArrayData a v něm zapouzdřeným polem) kopírovací konstruktor - vytváří nový objekt jako kopii původního (fyzicky se nic nekopíruje, jen se přidá další odkaz na již vytvořený objekt ShrArrayData). Je volán při předávání parametru hodnotou, definici s inicializací a při vrácení hodnoty z funkce

43 DArray - základní návrh II přiřazovací operátor - kopíruje obsah do již inicializovaného objektu (z levé na pravou stranu přiřazení). Nejdříve uvolní původní obsah měněného objektu (= uvolňuje odkaz na sdílená data) a pak odkaz přesměruje na nová sdílená data (podobně jako kopírovací konstruktor) destruktor - je volán při zániku objektu pole (= u objektů ve statických proměnných po ukončení funkce main, u automatických při opuštění bloku, u dynamicky alokovaných při dealokaci pomocí delete). Destruktor musí uvolnit sdílený objekt (= snížit počet odkazů resp. objekt nakonec destruovat). Destruktory jsou na rozdíl od C# v C++ důležité (užívají se i v případě, odkazů na jiné objekty nejen na prostředky OS) ostatní metody jsou triviální, neboť jen delegují svou funkci na sdílený obsah (jen u i indexace je navíc předefinování operátoru) tj. elegantnější rozhraní (funkčně však stejné) 43

44 DArray - deklarace deklarace je stručná. Všimněte si především datového členu - ukazatele na externí dynamicky alokovaný objekt. class DArray { ShrArrayData *sdata; public: DArray(int size); DArray(const DArray& s); ~DArray(); }; generativní konstruktor destruktor (musí být bezparametrický) kopírovací konstruktor parametrem musí být reference na objekt stejné třídy const DArray& operator= (const DArray& rv); int& operator[](int index){ return sdata->getitemref(index);} int length() const {return sdata->length();} 44

45 DArray - speciální metody DArray::DArray(int size) { sdata = new ShrArrayData(size);} DArray::DArray(const DArray& s) { sdata = s.sdata; sdata->acquire(); } DArray::~DArray() { if(sdata->release()) delete sdata; } 45 const DArray& DArray::operator= (const DArray& rv) { if(sdata->release()) delete sdata; sdata = rv.sdata; sdata->acquire(); }

46 DArray - kompletní kód následující kód obsahuje kompletní implementaci obou tříd a testovací kód (všimněte si jak je zajištěno vypsání kontrolní statické proměnné totalrefs po skončení funkce main) 46

47 Dynamická alokace objektů I operátor new lze kromě alokace polí použít i pro dynamickou alokaci jednotlivých objektů. V tomto případě lze uvést i příslušné parametry konstruktoru (v případě polní verze je pro položky vždy použita bezparametrická verze konstruktoru) DArray *da = new DArray(5); objekt je následně přístupný nepřímo pomocí ukazatele. Při volání metod (a přístupu k datovým členům) se používá operátor -> namísto operátoru tečka: např. ds->length() což je syntaktická zkratka za (*ds).length(). po ukončení životnosti objektů je objekt uvolněn pomocí operátoru delete (v rámci něj je volán i případný destruktor) delete da; není možné zaměňovat delete a jeho polní verzi (delete []) 47

48 Dynamická alokace objektů II kdy používat dynamickou alokaci objektů? u objektů s referenční sémantikou (= identita objektů identitě umístění v adresovém prostoru). Zde však lze referenční sémantiku zapouzdřit do hodnotového objektu (viz DArray) např: GUI objekty (okna, tlačítka), proudy apod. u složitěji strukturovaných objektů (jednotlivé části jsou dynamicky alokovány na požádání např. stromy, organizační jednotka (jednotliví zaměstnanci jsou dynamicky, GUI objekty u objektů polymorfních tříd (polymorfismus včetně pozdní vazby je plnohodnotně možný jen u dynamicky alokovaných objektů) GUI objekty (opět), bussines třídy apod. 48

49 Přetěžování operátorů I mechanismus přetěžování operátorů v C++ je podobný stejnému mechanismu v jazyce C# shodné je především omezení: přetěžovat lze jen existující operátory (a to ještě ne všechny), nelze měnit jejich prioritu ani asociativitu základní rozdíly: operátory se v C++ definují jako instanční metody resp. výjimečně jako externí funkce (v C# vždy jako statické metody) v C++ neexistuje automatické odvození příbuzných operátorů (v C# stačí např. definovat jen operátor "+" a tím jsou definovány i odvozené operátory inkrementace a složeného přiřazení +=, v C++ se musí definovat všechny tři resp. operátor inkrementace ve dvou podobách) některé operátory lze předefinovat jen v C++ (->, [], volání) 49

50 Přetěžování operátorů II základní pravidlo: přetěžování je vhodné jen pro sémanticky velmi omezenou skupinu tříd (především matematické objekty). Uplatnění v praxi tak není kromě základní domény příliš velké (jak např. definovat operátor "*" pro faktury?) unární operátory se definují jako bezparametrické metody Zlomek Zlomek::operator-() const; Zlomek Zlomek::operator++(); Zlomek Zlomek::operator++(int); //preinkrementace //postinkrementace binární operátory jako metody s jedním parametrem (levý operand je předán jako this Zlomek Zlomek::operator-(const Zlomek& rightop) const; Zlomek Zlomek::operator (const Zlomek& rightop) const; (jakou to má sémantiku?, primárně je to bitová operace OR) 50

51 Přetěžování operátorů III pokud není pravý operand třídou resp. je třídou uzavřenou (tj. např. knihovní třídou, v níž není operátor definován, ale kterou chceme rozšířit) je možno operátor definovat pomocí běžné funkce (s dvěma parametry) Zlomek operator+ (int leftop, const Zlomek& rightop) ostream& operator<< (ostream& out, const Zlomek& z); speciální pravidla platí pro přetěžování následujících operátorů: zde může být jen reference (tj. nelze použít ani předání hodnotou ani ukazatelem) new, delete (lze je přetěžovat jako metody pro řízení dyn. alokace objektů dané třídy, nebo jako funkci pro globální alokaci) operátoru volání funkce (objekt se následně syntakticky chová jako funkce), lze předefinovat pro různé parametry 51

52 Hodnotové přetypování pro hodnotové přetypování mezi objekty (tj. pro popis implicitní resp. explicitní konverze jednoho objektu na nový objekt jiného typu-třídy) lze použít: přetypovací konstruktor (u cílového typu) Zlomek::Zlomek(int i); //implicitní přetypování int -> Zlomek explicit Zlomek::Zlomek (int); // je nutné explicitní přetypování (Zlomek) 2 resp. Zlomek(2) přetypovací operátor (u zdrojového typu) Zlomek::operator double (); //přetypování Zlomek -> double // použije se např. ve výrazu Zlomek(1/2) poznámka: pro explicitní hodnotové přetypování lze kromě klasického přetypovacího operátoru (v infixové i konstruktorové notaci) použít i novější static_cast. 52

53 Dědičnost omezíme-li se na jednoduchou dědičnost pak je model C++ velmi blízký jazyku C# (model C++ je trochu jednodušší) dědění je relací (uspořádáním) mezi třídami. Podporuje znovupoužití kódu a poskytuje objektový polymorfismus (na rozdíl od C# je dědičnost jediným prostředkem polymorfismu, implementační rozhraní nejsou přímo podporována) objekty odvozené třídy dědí datové členy objektů třídy bázové a odvozená třída může přidávat další (na úrovni dat je dědičnost postupným skládáním = rozšiřováním) objekty odvozené třídy dědí i metody (signaturu + rozhraní + kontrakt), odvozené třídy však mohou metody překrýt (=předefinovat) resp. jen zastínit (je podporována statická i pozdní vazba). Nedědí se konstruktory. 53

54 Dědičnost - příklad I základní třída Není odvozena ze žádné další třídy (v C++ neexistuje žádná kořenová univerzální nadtřída tj. obdoba třídy Object). Třída je abstraktní, i když to není explicitně vyznačeno, obsahuje však abstraktní metodu (v C++ názvosloví čistě virtuální) class Message { protected: string msg; public: Message(const string& text) : msg(text) {} void printmessage() {cout << msg;} virtual void sendmessage() = 0; }; čistě virtuální metoda = abstraktní místo těla je konstrukce = 0 54

55 Dědičnost - příklad II odvozená (neabstraktní) třída je použito tzv. veřejné odvození tj. všechny zděděné metody si zachovají svůj přístup (především veřejné zůstávají veřejnými) ostatní typy se používají zřídka (nejedná se v zásadě o dědičnost ale o skládání, neboť původní rozhraní není přístupné) 55 class LocalMessage : public Message { protected: string username; public: volání konstruktoru nadtřídy }; LocalMessage(const string& text, const string& to) : Message(text), username(to) {} void printmessage() {cout << username << ":" << msg;} virtual void sendmessage() {...} zastínění metody (statická vazba = pravděpodobně sémant. chyba) předefinování (překrytí) metody (virtual je zde nepovinné, důležité je u předka)

56 Vícenásobná dědičnost stejně jako některé další OOP jazyka podporuje C++ vícenásobnou dědičnost, tj. schopnost třídy dědit z více nezávislých tříd. vícenásobná dědičnost na jedné straně dovoluje lépe modelovat realitu (a lépe více uplatňovat znovupoužitelnost), na druhé straně vznikají velké problémy s kolizí identifikátorů resp. signatur (třída může zdědit dvě stejnojmenné metody s různým kontraktem) a vícenásobným výskytem dat bázové podtřídy. Řešení jsou jen dílčí a navíc výrazně komplikují návrh (a popis) jazyka při rozumném využívání vícenásobné dědičnosti se však lze těmto problémům vyhnout (a neztratit se ve specifikaci jazyka). 56

57 Vícenásobná dědičnost II v zásadě lze rozlišit čtyři základní metodiky dědičnosti (které jsou navíc alespoň částečně kombinovatelné) 1) dědění čistě abstraktních tříd = odpovídá implementačním rozhraním v Javě a C# (existuje jen problém s kolizí) 2) dědění abstraktních tříd s rozšiřujícími metodami (= metody využívající jen abstraktních tříd rozhraní). Stejně bezpečné jako u čistě abstraktních tříd + omezená znovupoužitelnost) 3) vícenásobná dědičnost jako skládání: nejvhodnější metoda v případě, že nehrozí vícenásobný výskyt objektů podtřídy resp. je tento výskyt cílem. 4)virtuální vícenásobná dědičnost: řeší problém vícenásobné dědičnosti je však nejsložitější. 57

58 Čistě abstraktní třídy = rozhraní čistě abstraktní metody obsahují jen abstraktní metody. Mají tedy stejnou funkci jako konstrukce interface v Javě a C# (mohou obsahovat i statické konstantní členy) class Zobrazitelný { void Zobraz() = 0; void Skryj() = 0; } ve standardní knihovně se však prakticky žádné čistě abstraktní třídy (rozhraní) nevyskytují (a to ani pro základní koncepce jako Comparable, Equatable apod.) STL je spíše založena na šablonách a nikoliv na dědičnosti (proto hraje v C++ větší roli statický ekvivalent impl. rozhraní tzv. koncept) 58

59 Rozšířená rozhraní čistě abstraktní třídy nepodporují znovupoužitelnost a proto vedou v některých případech k rozsáhlé duplicitě kódu v C++ lze však vytvářet i abstraktní třídy, které obsahují implementace některých metod, jsou však z hlediska vícenásobné dědičnosti stejně bezpečné jako třídy čistě abstraktní (tj. nehrozí nejednoznačnost dědičnost při dědění více cestami). Implementované (=neabstraktní) metody však musí splňovat následující omezení: nesmí přistupovat k datovým členům (žádné ani nemají), místo toho volají příslušné abstraktní metody. nesmí být předefinovány (či zastíněny) tj. měly by být nevirtuální. class Zobrazitelný {... // deklar. abstraktní metody Zobraz a Skryj void Problikni() {Zobraz(); sleep(1); Skryj()} } 59

60 Vícenásobné cesty dědičnosti hlavním problém obecné vícenásobné dědičnosti je možnost existence více cest dědičnosti od bázové třídy kr třídě odvozené. Topologie dědičnosti může být složitá (vlastně jakýkoliv acyklický graf), ale nejjednodušším příkladem vícenásobných cest je tzv. kárové schéma [diamond schema] A B C D třída D je potomkem třídy A a to dvěma cestami (přes B nebo C). 60

61 Obecná vícenásobná dědičnost obecná vícenásobná dědičnost je na úrovni dat skládáním (objekt je sjednocením datových položek bezprostředních nadtříd). Pokud nedochází k vícenásobnému dědění je tento přístup zcela přirozený (navíc zděděné metody, vždy pracují nad svou dílčí částí objektu) v případě vícenásobných cest však dochází k duplikacím zděděných dat (jeden výskyt na každou cestu). U kárového schématu jsou tak například v objektu třídy D zahrnuty dvě kopie dat bázové třídy A. v některých případech je tento efekt v souladu s modelem (= představou implementátora). Je to však dosti výjimečné a omezené jen na jednoduché topologie (= např. kárové schéma). Klasickým případem jsou vstupně-výstupní proudy (i když i ty je lepší řešit pomocí skládání + adaptéru) 61

62 Obecná vícenásobná dědičnost II UML class diagram zjednodušené implementace IO streamů 62

63 Obecná vícenásobná dědičnost III objekty třída InputOutputStream zapouzdřují dva otevřené nízkoúrovňové proudy (souborové deskriptory), které jsou na sobě nezávislé. Navíc jsou nad nimi dva nezávislé buffery (zděděné z nadtříd InputStream a OutputStream) následující příklady ukazují možnosti volání zděděných metod na objektu třídy InputOutputStream: io->read(); //jednoznačné io -> open("test.dat"); //volá se překrytá verze přímo i InputOuputStream (ta pravděpodobně volá obě zděděné) io -> InputStream::open("test.dat") //volá se verze nad InputStream io -> close(); //syntaktická chyba io -> InputStream::close(); //volá se verze zděděná ze Stream pracující nad deskriptorem zděděným skrze InputStream 63

64 Obecná vícenásobná dědičnost IV výše uvedený příklad má několik dalších sémantických požadavků (resp. dokonce omezení): metoda close by měla být překryta i ve třídě InputOutputStream (měly by uzavírat oba dílčí proudy) musí být ošetřen přístup resp. uzavření neotevřeného dílčího proudu (např. pokud je otevřen je zapisovací a je provedeno čtení). někdy je také nutno znát i pořadí vyhodnocování konstruktorů. Ty se vyhodnocují podle algoritmu prohledávání do hloubky, kde pořadí na jednotlivých vrstvách je dáno pořadím nadtříd v hlavičce třídy (zleva doprava). Některé konstruktory jsou samozřejmě prováděny vícekrát (např. u kárového schématu v pořadí: ABACD). Sémantika by však na tomto pořadí neměla pokud možno záviset. 64

65 Virtuální dědičnost I jazyk C++ nabízí navíc i prostředek, který zajistí jedinečný výskyt datových členů podtřídy i při dědění více cestami. formálně se označuje jako virtuální dědění. Toto označení je dáno použitým klíčovým slovem, je však poněkud zavádějící (rozhodně nemá nic společného s virtuálními metodami). Lepší termínem by snad byla referenční dědičnost. formální použití: v místě, kde dochází k rozvětvení cest dědičnosti (které se pak někde spojí či potenciálně spojí) jsou nadtřídy uvozeny slovem virtual. class A {}; class B : virtual public A {}; //zde se dědičnost větví class C : virtual public B {}; //zde také class D : public B, public C {}; //zde se spojují (bez virtual!) 65

66 Virtuální dědičnost II interní implementace: při virtuálním odvození se nový objekt nevytvoří složením datových členů nadtřídy a podtřídy, ale složením (interní neviditelné) reference na data podtřídy a dat nadtřídy. Při spojení cest je pak možno sloučit data nadtřídy (opakují se jen reference ne data) normální dědičnost virtuální dědičnost třída A: A A třída B: A +B &A +B A třída C: A +C &A +C A třída D: A +B A +C +D &A +B &A +C A +D 66

67 Virtuální dědičnost II virtuální dědičnost komplikuje representaci objektů a snižuje jejich prostorovou a časovou efektivitu (zaujímají více místa a přístup ke členům je pomalejší) komplikují překladač (a tím jej zpomalují). Komplikují rutiny pro dynamické přetypování a dynamickou identifikaci typů. zesložiťují popis jazyka (musí totiž řešit i různé okrajové podmínky). Například musí být vloženo zvláštní pravidlo pro volání konstruktorů virtuálních nadtříd (ty se volají dříve než konstruktory běžných nadtříd opět v pořadí prohledávání do hloubky, v károvém schématu v pořadí: ABCD) nepoužívejte virtuální dědičnost příliš často (lépe je se jí zcela vyhnout) a pokud ano tak v optimálně (nadbytečné označení nadtříd jako virtuálních může vše výrazně zkomplikovat) 67

68 Přetypování I jazyk C byl jazyk se slabou typovou kontrolou, tj. hodnoty (především elementární typů a ukazatele) byly konvertovatelné na na jakýkoliv jiný datový typ a to často i implicitně (= bez nutnosti použít přetypovací operátor) jazyk C++ má již silnější typovou kontrolu, ale s použitím explicitního přetypovacího operátoru lze opět přetypovávat téměř bez omezení: (DArray&) 2.56; proto standard C++ obsahuje i novou sadu přetypovacích operátorů, které jsou sémanticky omezené a tudíž i v daném kontextu bezpečnější. Tři tvoří řadu s postupným uvolňováním omezení (vždy nejlepší použít ten nejstriktnější), jeden je specializovaný (a stojí mimo). dynamic_cast static_cast reinterpret_cats (const_cast) 68

69 Přetypování II dynamic_cast přetypování v rámci hierarchie dědičnosti mezi ukazateli a referencemi na základní a odvozené třídy (především ve směru bázová třída odvozená třída). Provádí se běhová typová kontrola. Při neúspěchu se vrací NULL ukazatel (u referencí se vyhodí výjimka bad_cast) static_cast přetypování v rámci hierarchie dědičnosti bez dynamické kontroly (vždy se povede), číselná přetypování, přetypování mezi třídami daná přetypovacími operátory a konverzními konstruktory reinterpret_cast libovolná přetypování, typicky mezi ukazately a referencemi na různé (nepříbuzné) typy, mezi čísly a ukazately, mezi strukturami a třídami (konverze na úrovni bytů) 69

70 Přetypování III const_cast přetypování konstantních ukazatelů a referencí na nekonstantní. Nemělo by se objevovat (obcházení zabezpečení), ale pokud je metoda chybně navržena (chybí const u metody či referencí), pak je jediným řešením (ostatní přetypovací operátory kromě obecného nefungují). Lze kombinovat s ostatními cast-operátory. Je použitelné i pro přetypování volatile ukazatelů/referencí. const_cast<pes*>(dynamic_cast<const Pes*>(zvire)) 70

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

přetížení operátorů (o) přetížení operátorů (o) - pro vlastní typy je možné přetížit i operátory (tj. definovat vlastní) - pro definici slouží klíčové slovo operator následované typem/znakem operátoru - deklarace pomocí funkčního

Více

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

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15 Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15 KAPITOLA 1 Úvod do programo vání v jazyce C++ 17 Základní pojmy 17 Proměnné a konstanty 18 Typy příkazů 18 IDE integrované vývojové

Více

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

PŘETĚŽOVÁNÍ OPERÁTORŮ PŘETĚŽOVÁNÍ OPERÁTORŮ Jazyk C# podobně jako jazyk C++ umožňuje přetěžovat operátory, tj. rozšířit definice některých standardních operátorů na uživatelem definované typy (třídy a struktury). Stejně jako

Více

Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz

Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz Upozornění pro čtenáře a uživatele této knihy Všechna práva vyhrazena. Žádná část této tištěné či elektronické knihy nesmí být reprodukována a šířena

Více

Generické programování

Generické programování Generické programování Od C# verze 2.0 = vytváření kódu s obecným datovým typem Příklad generická metoda, zamění dva parametry: static void Swap(ref T p1, ref T p2) T temp; temp = p1; p1 = p2; p2 =

Více

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

Programování v C++ 2, 4. cvičení Programování v C++ 2, 4. cvičení statické atributy a metody, konstruktory 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled Přístupová práva

Více

Úvod do programovacích jazyků (Java)

Úvod do programovacích jazyků (Java) Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2007/2008 c 2006 2008 Michal Krátký Úvod do programovacích

Více

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

PB161 Programování v jazyce C++ Přednáška 9 PB161 Programování v jazyce C++ Přednáška 9 Právo friend Přetěžování operátorů Nikola Beneš 16. listopadu 2015 PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 1 / 30 Reklama PB173 Tematicky

Více

Dědění, polymorfismus

Dědění, polymorfismus Programování v jazyce C/C++ Ladislav Vagner úprava Pavel Strnad Dědění. Polymorfismus. Dnešní přednáška Statická a dynamická vazba. Vnitřní reprezentace. VMT tabulka virtuálních metod. Časté chyby. Minulá

Více

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

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39 Programování v C# Hodnotové datové typy, řídící struktury Petr Vaněček 1 / 39 Obsah přednášky Referenční datové typy datové položky metody přístupové metody accessory, indexery Rozhraní Pole 2 / 39 Třídy

Více

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

Programování v C++ 1, 5. cvičení Programování v C++ 1, 5. cvičení konstruktory, nevirtuální dědění 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 2 3 Shrnutí minule procvičené

Více

Programování v jazyce C a C++

Programování v jazyce C a C++ Programování v jazyce C a C++ Richter 1 Petyovský 2 1. března 2015 1 Ing. Richter Miloslav, Ph.D., UAMT FEKT VUT Brno 2 Ing. Petyovský Petr, UAMT FEKT VUT Brno C++ Stručná charakteristika Nesdíĺı normu

Více

Úvod do programovacích jazyků (Java)

Úvod do programovacích jazyků (Java) Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2007/2008 c 2006 2008 Michal Krátký Úvod do programovacích

Více

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

PB161 Programování v jazyce C++ Přednáška 7 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

Více

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

PB161 Programování v jazyce C++ Přednáška 7 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

Více

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20 Obsah 5 Obsah Předmluva k aktuálnímu vydání 15 1 Úvod k prvnímu vydání z roku 2000 16 Typografické a syntaktické konvence................ 20 2 Základní pojmy 21 2.1 Trocha historie nikoho nezabije................

Více

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

PB161 Programování v jazyce C++ Přednáška 4 PB161 Programování v jazyce C++ Přednáška 4 Přetěžování funkcí Konstruktory a destruktory Nikola Beneš 9. října 2017 PB161 přednáška 4: přetěžování funkcí, konstruktory, destruktory 9. října 2017 1 / 20

Více

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

PB161 Programování v jazyce C++ Přednáška 4 PB161 Programování v jazyce C++ Přednáška 4 Dynamická alokace Kopírovací konstruktor Přetypování v C++ Nikola Beneš 12. října 2015 PB161 přednáška 4: dynamická alokace, kopírovací konstruktor, casting

Více

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

Programování v C++ 1, 6. cvičení Programování v C++ 1, 6. cvičení dědičnost, polymorfismus 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 2 3 Shrnutí minule procvičené

Více

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

přetížení operátorů (o) přetížení operátorů (o) - pro vlastní typy je možné přetížit i operátory (tj. definovat vlastní) - pro definici slouží klíčové slovo operator následované typem/znakem operátoru - operátor je speciální

Více

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

Přetěžování operátorů Přetěžování operátorů Cíle lekce Cílem lekce je seznámit se s mechanizmem přetížení operátorů a s použitím tohoto mechanizmu při návrhu a implementaci programů. Po absolvování lekce budete: umět využívat

Více

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

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března Polymorfismus Cíle lekce Cílem lekce je vysvětlit význam pojmu polymorfismus jako základní vlastnosti objektově orientovaného programování. Lekce objasňuje vztah časné a pozdní vazby a jejich využití.

Více

Virtuální metody - polymorfizmus

Virtuální metody - polymorfizmus - polymorfizmus - potomka lze použít v místě, kde je možné použít předka - v dosud probraných situacích byly vždy volány funkce, které jsou známy již v době překladu. V situaci, kdy v době překladu není

Více

5 Přehled operátorů, příkazy, přetypování

5 Přehled operátorů, příkazy, přetypování 5 Přehled operátorů, příkazy, přetypování Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně budou uvedeny detaily týkající se operátorů. Doba nutná k nastudování

Více

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

Dynamicky vázané metody. Pozdní vazba, virtuální metody Dynamicky vázané metody Pozdní vazba, virtuální metody Motivace... class TBod protected: float x,y; public: int vrat_pocet_bodu() return 1; ; od třídy TBod odvodíme: class TUsecka: public TBod protected:

Více

PREPROCESOR POKRAČOVÁNÍ

PREPROCESOR POKRAČOVÁNÍ PREPROCESOR POKRAČOVÁNÍ Chybová hlášení V C# podobně jako v C++ existuje direktiva #error, která způsobí vypsání chybového hlášení překladačem a zastavení překladu. jazyk C# navíc nabízí direktivu #warning,

Více

Zápis programu v jazyce C#

Zápis programu v jazyce C# Zápis programu v jazyce C# Základní syntaktická pravidla C# = case sensitive jazyk rozlišuje velikost písmen Tzv. bílé znaky (Enter, mezera, tab ) ve ZK překladač ignoruje každý příkaz končí ; oddělovač

Více

typová konverze typová inference

typová konverze typová inference Seminář Java Programování v Javě II Radek Kočí Fakulta informačních technologií VUT Únor 2008 Radek Kočí Seminář Java Programování v Javě (2) 1/ 36 Téma přednášky Rozhraní: použití, dědičnost Hierarchie

Více

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

Programování v C++ 3, 3. cvičení Programování v C++ 3, 3. cvičení úvod do objektově orientovaného programování 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled Dokončení spojového

Více

Více o konstruktorech a destruktorech

Více o konstruktorech a destruktorech Více o konstruktorech a destruktorech Více o konstruktorech a o přiřazení... inicializovat objekt lze i pomocí jiného objektu lze provést přiřazení mezi objekty v původním C nebylo možné provést přiřazení

Více

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

14.4.2010. Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod. Základy programování (IZAPR) Přednáška 7 Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 229, Náměstí Čs. legií Michael.Bazant@upce.cz Obsah přednášky 7 Parametry metod, předávání

Více

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) Michal Krátký 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků

Více

Abstraktní třídy, polymorfní struktury

Abstraktní třídy, polymorfní struktury Karel Müller, Josef Vogel (ČVUT FIT) Abstraktní třídy, polymorfní struktury BI-PA2, 2011, Přednáška 9 1/32 Abstraktní třídy, polymorfní struktury Ing. Josef Vogel, CSc Katedra softwarového inženýrství

Více

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) Michal Krátký 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků

Více

Teoretické minimum z PJV

Teoretické minimum z PJV Teoretické minimum z PJV Pozn.: následující text popisuje vlastnosti jazyka Java zjednodušeně pouze pro potřeby výuky. Třída Zavádí se v programu deklarací třídy což je část programu od klíčových slov

Více

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Maturitní otázky z předmětu PROGRAMOVÁNÍ Wichterlovo gymnázium, Ostrava-Poruba, příspěvková organizace Maturitní otázky z předmětu PROGRAMOVÁNÍ 1. Algoritmus a jeho vlastnosti algoritmus a jeho vlastnosti, formy zápisu algoritmu ověřování správnosti

Více

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

IB111 Programování a algoritmizace. Objektově orientované programování (OOP) IB111 Programování a algoritmizace Objektově orientované programování (OOP) OP a OOP Objekt Kombinuje data a funkce a poskytuje určité rozhraní. OP = objektové programování Vše musí být objekty Např. Smalltalk,

Více

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

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ 1) PROGRAM, ZDROJOVÝ KÓD, PŘEKLAD PROGRAMU 3 2) HISTORIE TVORBY PROGRAMŮ 3 3) SYNTAXE A SÉMANTIKA 3 4) SPECIFIKACE

Více

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

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

Více

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

Jazyk C++ 1. Blok 3 Objektové typy jazyka C++ Třída. Studijní cíl. Doba nutná k nastudování. Průvodce studiem Jazyk C++ 1 Blok 3 Objektové typy jazyka C++ Studijní cíl Ve třetím bloku bude představen a rozebrán nejdůležitější objektový typ jazyka C++ a to sice třída. Po absolvování bloku bude student schopen navrhovat

Více

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní Základy jazyka C# doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Obsah přednášky Architektura.NET Historie Vlastnosti

Více

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

8 Třídy, objekty, metody, předávání argumentů metod 8 Třídy, objekty, metody, předávání argumentů metod Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost třídám a objektům, instančním

Více

konstruktory a destruktory (o)

konstruktory a destruktory (o) konstruktory a destruktory (o) - slouží k ovlivnění vzniku (inicializace) a zániku (úklid) objektu - základní myšlenkou je, že proměnná by měla být inicializována (nastavena do počátečního stavu) a zároveň

Více

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

ZPRO v C Ing. Vít Hanousek. verze 0.3 verze 0.3 Hello World Nejjednoduší program ukazující vypsání textu. #include using namespace std; int main(void) { cout

Více

Programování v jazyce C a C++

Programování v jazyce C a C++ Programování v jazyce C a C++ Příklad na tvorbu třídy Richter 1 4. prosince 2017 1 Ing. Richter Miloslav, Ph.D., UAMT FEKT VUT Brno Dvourozměrné pole pomocí tříd Zadání Navrhněte a napište třídu pro realizace

Více

1. Dědičnost a polymorfismus

1. Dědičnost a polymorfismus 1. Dědičnost a polymorfismus Cíl látky Cílem této kapitoly je představit klíčové pojmy dědičnosti a polymorfismu. Předtím však je nutné se seznámit se základními pojmy zobecnění neboli generalizace. Komentář

Více

Výrazy, operace, příkazy

Výrazy, operace, příkazy Výrazy, operace, příkazy Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Přednášky byly připraveny s pomocí materiálů, které vyrobili Ladislav Vágner, Pavel Strnad Karel Richta, Martin Hořeňovský,

Více

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/04.0006

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/04.0006 Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/04.0006 Lekce 1 Jazyk Java Tento projekt je spolufinancován Evropským sociálním fondem

Více

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.

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. Informatika 10. 9. 2013 Jméno a příjmení Rodné číslo 1) Napište algoritmus pro rychlé třídění (quicksort). 2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus

Více

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

Programování v C++ 1, 1. cvičení Programování v C++ 1, 1. cvičení opakování látky ze základů programování 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 2 Shrnutí procvičených

Více

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií 1 Fakulta elektrotechniky a informatiky Katedra softwarových technologií 12. října 2009 Organizace výuky Přednášky Teoretické základy dle normy jazyka C Cvičení Praktické úlohy odpřednášené látky Prostřední

Více

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

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016 ZPRO cvičení 2 Martin Flusser Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague October 17, 2016 Outline I 1 Outline 2 Proměnné 3 Proměnné - cvičení 4 Funkce 5 Funkce

Více

Jazyk C++ I. Polymorfismus

Jazyk C++ I. Polymorfismus Jazyk C++ I Polymorfismus AR 2013/2014 Jazyk C++ I Operátory Co to vůbec jsou operátory? Na co je používáme? AR 2013/2014 Jazyk C++ I 2 Operátory Můžeme si upravit operátory pro vlastní objektové typy?

Více

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

OBJEKTOVÉ PROGRAMOVÁNÍ V C++ V PŘÍKLADECH 8 Proudová knihovna 8.1 Hierarchie proudů... 8-1 8.2 Standardně zavedené proudy... 8-1 8. David MATOUŠEK OBJEKTOVÉ PROGRAMOVÁNÍ V C++ V PØÍKLADECH Praha 2011 David Matoušek Objektové programování v C++ v pøíkladech Lektoroval Ing. Bohumil Brtník, Ph.D. Bez pøedchozího písemného svolení nakladatelství

Více

Objektové programování

Objektové programování Objektové programování - přináší nové možnosti a styl programování - vytváří nový datový typ, který umí vše co standardní datové typy + to co ho naučíme - překladač se k tomuto typu chová stejně jako k

Více

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) Operátory new a delete, virtuální metody Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody Dynamická alokace paměti Jazyky C a C++ poskytují programu možnost vyžádat si část volné operační paměti pro

Více

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

Programování v C++, 2. cvičení Programování v C++, 2. cvičení 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 Operátory new a delete 2 3 Operátory new a delete minule

Více

Konstruktory a destruktory

Konstruktory a destruktory Konstruktory a destruktory Nedostatek atributy po vytvoření objektu nejsou automaticky inicializovány hodnota atributů je náhodná vytvoření metody pro inicializaci, kterou musí programátor explicitně zavolat,

Více

Funkční objekty v C++.

Funkční objekty v C++. Funkční objekty v C++. Funkční objekt je instance třídy, která má jako svou veřejnou metodu operátor (), tedy operátor pro volání funkce. V dnešním článku si ukážeme jak zobecnit funkci, jak používat funkční

Více

Mělká a hluboká kopie

Mělká a hluboká kopie Karel Müller, Josef Vogel (ČVUT FIT) Mělká a hluboká kopie BI-PA2, 2011, Přednáška 5 1/28 Mělká a hluboká kopie Ing. Josef Vogel, CSc Katedra softwarového inženýrství Katedra teoretické informatiky, Fakulta

Více

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

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky JAVA Třídy Definice třídy úplná definice [public] [abstract] [final] class Jmeno [extends Predek] [impelements SeznamInterfacu] {... // telo tridy public veřejná třída abstract nesmí být vytvářeny instance

Více

Stručný obsah První týden Druhý týden 211 Třetí týden 451 Rejstřík 787

Stručný obsah První týden Druhý týden 211 Třetí týden 451 Rejstřík 787 Stručný obsah První týden 25 den 1 Začínáme 27 den 2 Anatomie programu C++ 43 den 3 Proměnné a konstanty 57 den 4 Výrazy a příkazy 79 den 5 Funkce 107 den 6 Objektově orientované programování 141 den 7

Více

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

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda 1. Lze vždy z tzv. instanční třídy vytvořit objekt? 2. Co je nejčastější příčinou vzniku chyb? A. Specifikace B. Testování C. Návrh D. Analýza E. Kódování 3. Je defenzivní programování technikou skrývání

Více

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) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků

Více

Úvod do programování. Lekce 1

Úvod do programování. Lekce 1 Úvod do programování Lekce 1 Základní pojmy vytvoření spustitelného kódu editor - psaní zdrojových souborů preprocesor - zpracování zdrojových souborů (vypuštění komentářů atd.) kompilátor (compiler) -

Více

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13 Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13 KAPITOLA 1 Na úvod o Javě 15 Počítačový program 15 Vysokoúrovňový programovací

Více

Jazyk C++, některá rozšíření oproti C

Jazyk C++, některá rozšíření oproti C Karel Müller, Josef Vogel (ČVUT FIT) Jazyk C++, některá rozšíření oproti C BI-PA2, 2011, Přednáška 1 1/22 Jazyk C++, některá rozšíření oproti C Ing. Josef Vogel, CSc Katedra softwarového inženýrství Katedra

Více

Seminář Java II p.1/43

Seminář Java II p.1/43 Seminář Java II Seminář Java II p.1/43 Rekapitulace Java je case sensitive Zdrojový kód (soubor.java) obsahuje jednu veřejnou třídu Třídy jsou organizovány do balíků Hierarchie balíků odpovídá hierarchii

Více

Jazyky C a C++ kompletní průvodce 2., aktualizované vydání. Miroslav Virius

Jazyky C a C++ kompletní průvodce 2., aktualizované vydání. Miroslav Virius Upozornění pro čtenáře a uživatele této knihy Všechna práva vyhrazena. Žádná část této tištěné či elektronické knihy nesmí být reprodukována a šířena v papírové, elektronické či jiné podobě bez předchozího

Více

Dynamická identifikace typů v C++.

Dynamická identifikace typů v C++. Dynamická identifikace typů v C++. Pod pojmem "Dynamická identifikace typů" rozumíme zjišťování typů proměnných, nebo objektů v době běhu programu. Identifikaci typů zajišťuje operátor typeid. Než se ale

Více

Osnova přednášky. Programové prostředky řízení Úvod do C# II. Přístup ke členům. Členy (Members)

Osnova přednášky. Programové prostředky řízení Úvod do C# II. Přístup ke členům. Členy (Members) Osnova přednášky Programové prostředky řízení Úvod do C# II. Členy (Members) Jmenné prostory (Namespaces) Třídy (Classes) Struktury (Structs) Pavel Balda Západočeská univerzita v Plzni, FAV, KKY 2 Členy

Více

Výrazy, operace, příkazy

Výrazy, operace, příkazy Výrazy, operace, příkazy Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Přednášky byly připraveny i s pomocí materiálů, které vyrobili Ladislav Vágner, Pavel Strnad Karel Richta, Martin Hořeňovský,

Více

Jazyk C++ I. Šablony 2

Jazyk C++ I. Šablony 2 Jazyk C++ I Šablony 2 AR 2013/2014 Jazyk C++ I Třídy template class TVektor { T *a; int n; static int PocInstanci; public: TVektor(int _n = 0) : n(_n) { a = new T[n]; PocInstanci++; } ~TVektor()

Více

Programovací jazyk C++ Hodina 1

Programovací jazyk C++ Hodina 1 Programovací jazyk C++ Hodina 1 Používané překladače Bloodshed Dev C++ http://www.bloodshed.net/devcpp.html CodeBlocks http://www.codeblocks.org pokud nemáte již nainstalovaný překladač, stáhněte si instalátor

Více

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

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd 7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd Algoritmizace (Y36ALG), Šumperk - 7. přednáška 1 Třída jako zdroj funkcionality Třída v jazyku Java je programová jednotka tvořená

Více

Jazyk C++ I. Polymorfismus

Jazyk C++ I. Polymorfismus Jazyk C++ I Polymorfismus AR 2013/2014 Jazyk C++ I Úvod Metody s časnou vazbou jsou překládány jako obyčejné céčkovské funkce. Této metodě je předán jako první implicitní parametr this. Rozdíl mezi obyčejnou

Více

Objekty v PHP 5.x. This is an object-oriented system. If we change anything, the users object.

Objekty v PHP 5.x. This is an object-oriented system. If we change anything, the users object. Objekty v PHP 5.x This is an object-oriented system. If we change anything, the users object. Objektové PHP Objekty se poprvé objevili v PHP ve verzi 4. Nepříliš zdařilý pokus. Programátoři získali nedůvěru

Více

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ 4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ OBJEKT Program v Javě je staticky strukturován na třídy, jejichž instance (objekty) za běhu dynamicky programu vznikají a zanikají. Objekt je nejprve

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Výrazy Operátory Výrazy Verze pro akademický rok 2012/2013 1 Operace, operátory Unární jeden operand, operátor se zapisuje ve většině případů před operand, v některých případech

Více

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) Statické proměnné a metody, šablony v C++ Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++ Globální konstantní proměnné Konstantní proměnné specifikujeme s klíčovým slovem const, tyto konstantní proměné

Více

ADT/ADS = abstraktní datové typy / struktury

ADT/ADS = abstraktní datové typy / struktury DT = datové typy obor hodnot, které může proměnná nabývat, s operacemi na tomto oboru určen: obor hodnot + výpočetní operace např. INT = { 2 147 483 648 až +2 147 483 647} + {+,,*,/,} ADT/ADS = abstraktní

Více

Výčtový typ strana 67

Výčtový typ strana 67 Výčtový typ strana 67 8. Výčtový typ V této kapitole si ukážeme, jak implementovat v Javě statické seznamy konstant (hodnot). Příkladem mohou být dny v týdnu, měsíce v roce, planety obíhající kolem slunce

Více

Šablony, kontejnery a iterátory

Šablony, kontejnery a iterátory 11. března 2015, Brno Připravil: David Procházka Šablony, kontejnery a iterátory Programovací jazyk C++ Šablony Strana 2 / 31 Obsah přednášky 1 Šablony 2 Abstraktní datové struktury 3 Iterátory 4 Array

Více

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

Základy C++ I. Jan Hnilica Počítačové modelování 18 Základy C++ I 1 Přechod z C na C++ jazyk C++ je nadmnožinou jazyka C z hlediska syntaxe se jedná o velmi podobné jazyky, spolu s dalšími jazyky "céčkovské" rodiny, jako je např. C# každý platný program

Více

Odvozené a strukturované typy dat

Odvozené a strukturované typy dat Odvozené a strukturované typy dat Petr Šaloun katedra informatiky FEI VŠB-TU Ostrava 14. listopadu 2011 Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Odvozené a strukturované typy dat 14. listopadu

Více

11.5.2012. 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

11.5.2012. 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 Obsah přednášky 9 Základy programování (IZAPR, IZKPR) Přednáška 9 Základy dědičnosti, přístupová práva Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 03 022, Náměstí Čs. legií

Více

Základy objektové orientace I. Únor 2010

Základy objektové orientace I. Únor 2010 Seminář Java Základy objektové orientace I Radek Kočí Fakulta informačních technologií VUT Únor 2010 Radek Kočí Seminář Java Základy OO (1) 1/ 20 Téma přednášky Charakteristika objektově orientovaných

Více

O datových typech a jejich kontrole

O datových typech a jejich kontrole .. O datových typech a jejich kontrole Programovací techniky doc. Ing. Jiří Rybička, Dr. ústav informatiky PEF MENDELU v Brně rybicka@mendelu.cz Typová kontrola Programovací techniky O datových typech

Více

Programování II. Polymorfismus

Programování II. Polymorfismus Programování II Polymorfismus Osnova přednášky Vztah přetížení, překrytí a protected přístupu. Co je polymorfismus? Příklad. Přetížení, překrytí, protected Přetížení x překrytí Přetížením řešíme doplnění

Více

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) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků

Více

Zpracoval: houzvjir@fel.cvut.cz

Zpracoval: houzvjir@fel.cvut.cz Zpracoval: houzvjir@fel.cvut.cz 10. Objektově orientované programování v C++. Přetěţování operátorů, generické funkce a třídy, výjimky, knihovny. (A7B36PJC) Obsah OOP v C++... 2 Pro připomenutí - Základní

Více

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

24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1 24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE AUTOR DOKUMENTU: MGR. MARTINA SUKOVÁ DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 UČIVO: STUDIJNÍ OBOR: PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) INFORMAČNÍ TECHNOLOGIE

Více

7. Datové typy v Javě

7. Datové typy v Javě 7. Datové typy v Javě Primitivní vs. objektové typy Kategorie primitivních typů: integrální, boolean, čísla s pohyblivou řádovou čárkou Pole: deklarace, vytvoření, naplnění, přístup k prvkům, rozsah indexů

Více

Sdílení dat mezi podprogramy

Sdílení dat mezi podprogramy Sdílení dat mezi podprogramy Datové objekty mohou být mezi podprogramy sdíleny pomocí ne-lokálních referenčních prostředí, která jsou vytvářena na základě æ explicitních modifikací (formální parametry

Více

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

Programování II. Abstraktní třída Vícenásobná dědičnost 2018/19 Programování II Abstraktní třída Vícenásobná dědičnost 2018/19 Osnova přednášky Polymorfismus - důsledky. Abstraktní třída. Vícenásobná dědičnost. Polymorfismus - důsledky Polymorfismus Polymorfismus je

Více

Data, výrazy, příkazy

Data, výrazy, příkazy Data, výrazy, příkazy Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Přednášky byly připraveny s pomocí materiálů, které vyrobili Ladislav Vágner, Pavel Strnad, Martin Hořeňovský, Aleš Hrabalík

Více

V dalších letech se pak začaly objevovat první normy pro jazyk C++ (ISO/IEC 14882:1998; ISO/IEC 9899:1999; ISO/IEC 14882:2003; ISO/IEC 14882:2011).

V dalších letech se pak začaly objevovat první normy pro jazyk C++ (ISO/IEC 14882:1998; ISO/IEC 9899:1999; ISO/IEC 14882:2003; ISO/IEC 14882:2011). Jazyk C++ 1 Blok 1 Úvod do programovacího jazyka C++ Studijní cíl První blok kurzu je věnován úvodu do problematiky programovacího jazyka C++. V bloku budou rozebrány historické souvislosti programovacích

Více

Správa paměti. doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 /

Správa paměti. doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / Správa paměti doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Obsah přednášky Motivace Úrovně správy paměti. Manuální

Více

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

Vyřešené teoretické otázky do OOP ( ) Vyřešené teoretické otázky do OOP (16. 1. 2013) 1) Vyjmenujte v historickém pořadí hlavní programovací paradigmata a stručně charakterizujte každé paradigma. a) Naivní chaotičnost, špatná syntaxe a sémantika

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Typy Základní (primitivní) datové typy Deklarace Verze pro akademický rok 2012/2013 1 Typy v jazyce Java Základní datové typy (primitivní datové typy) Celočíselné byte, short,

Více