Konzultaní hodiny - dotazy na pednáškách - dotazy na cvieních - konference - - Richter 10:00-10:45 steda - individuální dohoda

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

Download "Konzultaní hodiny - dotazy na pednáškách - dotazy na cvieních - konference - email - Richter 10:00-10:45 steda - individuální dohoda"

Transkript

1 1. Úvod Pednášky 2 hodiny steda cca v devátém týdnu plsemestrálka opakování C pevážn C++. C jen opakování C je prerekvizita probráno v BPC1 a BPC2 pedpokládaný obsah pednášek a cviení je na síti: dzin_app: everyone / vyuka / richter / bppc nebo ftp pístup. ftp dzin.feec.vutbr.cz nejlépe pedem proíst téma hodiny, Pednášející: Richter richter@feec.vutbr.cz Cviení - rozdlení podle rozvrhu dv hodiny týdn - lab. 240 ve skupinách po dvou lidech, projekty po tech - pracujeme v Microsoft Visual C++, je možné jakýkoli peklada C++ respektující aktuáln platnou normu, ped odevzdáním v MVC++ - vytváení program na úrovni konzolových aplikací - hlavní náplní bude tvorba tíd a jejich rozhraní - pro každé cviení bude na síti pipraveno zadání - vystaveno starší cviení s vtší váhou na C Cviící: Richter, Petyovský petyovsk@feec.vutbr.cz Domácí práce - píprava na pednášky, cviení - pítomnost na pednáškách, cvieních - zkusit si naprogramovat píklady ze cviení - vypracovat alespo vzorové tídy a projekt - nutná motivace vyberte si zajímavý úkol

2 Konference - loská a pedloská konference na www. pandora. cz. Praktické programování v C++. Nkdy nežije problémy se školními maily. Je dobré si ji peíst - Pokusíme se bu oživit pandoru, nebo založit konferenci na školním serveru - Ureno pedevším pro technické diskuze o jazyku C a C++. Konzultaní hodiny - dotazy na pednáškách - dotazy na cvieních - konference - - Richter 10:00-10:45 steda - individuální dohoda Hodnocení - Bodování zpsob je kompromisem Plsemestrální písemný test klíová slova, makra, jednoduchý píklad z jazyka C. 30 bod Projekt tvorba tídy a její použití, prezentace na cvieních 20 bod Písemná zkouška píklady jazyka C++, 50 bod. Jeden termín ádný, dva opravné. Testy jsou písemné Zápoet je ze cviení odevzdán projekt a dosaženo alespo 5 bod. Zápoet nutný k pístupu na zkoušku Literatura Skripta kapitola o C a základy C++ jsou v poádku, ddní je zatím informativn. Na konci kapitol skript je shrnutí nutno znát a vdt pro. Poznámky v textu rozšíení látky Knihy každý msíc vychází nová, je možno si vybrat tu nejvhodnjší

3 Odkazy na síti vtšina se ukázala jako špatná (nepesnosti, neúplnosti) Norma 2. Motivace C++ C++ - rozšiuje programovací možnosti C - pidává objektové vlastnosti - C mže mít nkteré vlastnosti navíc - C pijímá nkteré vlastnosti z C++ Tída - nový složený typ (nástupce struct) - data a práce s nimi - nejblíže k ní má knihovní celek z jazyka C rozhraní, data, kód Návrh tídy - formulace (definice) problému slovní popis - rozbor problému - návrh datové struktury - návrh metod - testování Formulace problému - co má tída dlat obecn - jak vzniká - jak zaniká - jak nastavujeme hodnoty - jak vyítáme hodnoty - jak pracujeme s hodnotami (metody a operátory) - vstup a výstup

4 Rozbor problému - konzultace možných ešení, koncepce - rozhodneme, zda je možné použít stávající tídu, zda je možné upravit stávající tídu (ddní), zda vytvoíme více tíd (bu výsledná tída bude obsahovat jinou tídu jako lenská data, nebo vytvoíme hierarchii pipravíme základ, ze kterého se bude ddit všichni potomci budou mít shodné vlastnosti). (Objekt je prvkem a objekt ddí z ) - pohled uživatele (interface), pohled programátora (implementace) Návrh datové struktury - zvolí se data (promnné a jejich typ) které bude obsahovat, mže to být i jiná tída - bhem dalšího návrhu nebo až pi delší práci se mže ukázat jako nevyhovující - Data jsou (vtšinou) skrytá Návrh metod - metoda funkce ve tíd pro práci s daty tídy - metody vzniku a zániku - metody pro práci s daty - metody pro práci s objektem - operátory - vstupy a výstupy - metody vzniklé implicitn (ošetit dynamická data) - zde se (hlavn) zužitkuje C - algoritmy testování - na správnost funkce - kombinace volání - práce s pamtí (dynamická data) - vznik a zánik objekt (poet vznik = poet zánik) - testovací soubory pro automatické kontroly pi zmnách kódu

5 pístup k datm a metodám objektu pístup k datm uvnit metod - this konstruktory destruktory operátory 3. Jazyk C++ jazyk vyšší úrovn existuje norma objektov orientován penositelný kód C je podmnožinou C++ Zmny oproti C - rozšíení možností programovacího jazyka - objektové vlastnosti - šablony - nová klíová slova Neobjektové vlastnosti - petžování funkcí a operátor - definice promnné - reference - implicitní parametry - prostory jmen - typ bool - alokace pamti (new, delete) - typov orientovaný vstup výstup - inline funkce - šablony Objektové vlastnosti - objekty

6 - ddní - výjimky 3.1 Objektové programování, základní definice - nové možnosti programování - sdružování dat a metod (a operátor) s nimi pracujících - práva pístupu k datm - zdrojový kód pípona cpp. (hlavikové soubory bez pípony nebo h, hpp, hxx ) - výhody: tvorba knihoven, sdílení kódu, údržba programu Základní pojmy - tída (class) - datový celek (datová abstrakce), data + operace, pístupová práva - instance - promnná - objekt - instance njaké tídy - metoda - funkce definovaná ve tíd pro práci s daty - zapouzdení ( encapsulation) - konstruktor a destruktor - metody pro inicializaci a likvidaci objektu - rozhraní ( interface ) - co tída nabízí ven - implementace - jak to dlá tída uvnit - ddinost ( inheritance ) - použití kódu pro podobnou tídu - polymorfismus - tídy se stejným rozhraním, a rznou implementací, jednotný pístup k instancím 3.2 komentáe (no) - v C víceádkové komentáe /* */ - vnoené komentáe (?) - v C++ navíc jednoádkový komentá: // až konec ádku - // již i v C int k; // komentá

7 // komentá mže zaínat kdekoli, int i ; /* Starý typ lze použít */ 3.3 pojem tídy a struktury v C++ (o) - složený datový typ jako struct - objektové vlastnosti rozšíeny i pro struct a union - klíové slovo class - deklarace tídy - pouze popis tídy nevyhrazuje pam class jméno_tídy { parametry, tlo tídy }; struct jméno_struktury {parametry, tlo }; - deklarace jména tídy lze použít pouze adresu - vlastní popis tídy pozdji class jméno_tídy; struct jméno_struktury; - definice promnné jméno_tídy a, b, *pc; 3.4 deklarace a definice promnných (no) - v C na zaátku bloku programu - v C++ v libovolném míst (deklarace je píkaz) - deklarace ve for - konec s koncem bloku - deklarace musí mít extern for (int i=0;i<10;i++) { /* zde je i známo */ double dd;

8 } // zde koní i a dd 3.5 data, metody - práce s nimi (o) - datové leny jakýkoli známý typ (jinak ukazatel) - metody - pístupová práva - lenská data a metody class Jmeno_tídy { int data1; float data2; Jmeno *j; char string[100]; int metoda1() { return 2;} void metoda2(int a,float b) { } float mmetoda3( int a1, Jmeno *a2); }; Jmeno_tídy aa; int b = aa.metoda3(34, ); 3.6 pístupová práva (o) - klíová slova private, public, protected - pepínae - možno vkládat libovoln - rozdíl mezi class a struct implicitní pístupové právo struct Komplex { // public: - implicitní double Re, Im; // public private: // pepína pístupových práv

9 double Velikost(void) {return 14;} // funkce interní int pom; // interní-privátní promnná public: // pepína pístupových práv double Uhel(double a ) {return a-2;} }; Komplex a,b; a.re = 1; // je možné b.uhel(3.14); // je možné a.pom = 3; // není možné b.velikost(); // není možné class { int i je ekvivalentní struct { int i je ekvivalentní class {private: int i struct {public: int i 3.6 reference (no) - v C hodnotou (pímou nebo hodnotou ukazatele, pole) - v C++ reference odkaz (alias, pezdívka) - zápis Typ& a musí být inicializován T tt, &ref=tt; // definice s inicializací extern T &ref; // deklarace Typ& pom = p1.p2.p3.p4; // lepší pístup double Real(T &r) {r = 4;} //pedání do funkce - splývá pedávání hodnotou a referencí (až na prototyp stejné) - práce s referencí = práce s pvodní odkazovanou promnnou

10 - nelze reference na referenci, na bitová pole, - nelze pole referencí, ukazatel na referenci 3.7 this (o) - v každé instanci ukazatel na aktuální prvek - T* const this; - klíové slovo - pedán implicitn do každé metody (skrytý parametr-peklada) používá se: - pístup k datm a metodám aktuálního prvku (this je možné vynechat) this->data = 5, b = this->metoda( a ) - objekt vrací sám sebe return *this; - kontrola parametru s aktuálním prvkem if (this==&param) - metoda pro vrácení maxima Komplex& Max(Komplex &param) // & reference { if (this == &param) // & adresa return *this;// oba parametry totožné if ( this->re < param.re ) return param; else return *thís; } volání: c = a.max(b); c = a.max(a); alternativní hlaviky Komplex Max(Komplex param) Komplex & Max(Komplex const &param) 3.8 operátor píslušnosti :: (no)

11 - odlišení datových prostor (a tíd) - pístup ke stejnojmenným globálním promnným Prostor::JménoPromnné Prostor::JménoFunkce int Stav; fce() { int Stav; Stav = 5; ::Stav = 6; } int Komplex::metoda(int, int) {} 3.9 statický datový len tídy (o) - vytváí se pouze jeden na tídu, spolený všem objektm tídy - nap. poítání aktivních objekt tídy, - v deklaraci tídy oznaen jako static class string { static int pocet; // deklarace } - nemusí být žádný objekt tídy - vytvoí se jako globální promnná (nutno inicializovat) int string::pocet = 0; 3.10 petžování funkcí (no) - v C jediná funkce s daným jménem - v C++ více stejnojmenných funkcí petžování - (petžovování není pekrytí ale pidání) - funkce odlišené potem nebo typem parametr, prostorem,

12 - typ návratové hodnoty nerozlišuje - pi volání vybírá peklada na základ kontextu - pednost má nejbližší jinak uvést celé - Prostor::Jméno - problém s konverzemi int f(int); float f(int); // nelze rozlišit float f(float); float ff = f(3); // volání f(int) f(3.14); // chyba double lze na int i float // peklada neví f( (float) 3.14); // v poádku 3.11 implicitní parametry (no) - parametr, který se dosadí, není-li uveden pi volání - uvádí se (pouze jedenkrát) v deklaraci (h. soubory) - uvádí se od poslední promnné - pi volání se vynechávají od poslední promnné - nejen hodnota ale libovolný výraz (konstanta, volání funkce, promnná ) int f(float a=4,float b=random()); //deklarace // funkce je použita pro volání f(); f(22); f(4,2.3); // a koliduje s (zastupuje i) f(void); f(float); f (float, float); // a nkdy i

13 f(char); // nejednoznanost pi volání s parametrem int konverze na char i float 3.12 petypování (no) - explicitní (vynucená) zmna typu promnné - v C se provádí (float) i - v C++ se zavádí funkní petypování float(i) - operátor - lze nadefinovat tuto konverzi-petypování u vlastních typ 3.13 const, const parametry (no) - vytvoení konstantní (nemnné) promnné - nelze mnit kontroluje peklada chyba - obdoba #define PI z jazyka C - typ promnné je souástí definice const float PI=3.1415; - obvykle dosazení pímé hodnoty pi pekladu - nepedávat odkazem (nkdy vytvoena doasná promnná) U použití ve více modulech (deklarace-definice v h souboru) - u C je const char a= b ; evivalentní extern const char a= b ; - pro lokální viditelnost - static const char a= b ; - u C++ je const char a= b ; evivalentní static const char a= b ; - pro globální viditelnost - extern const char a= b ; - potlaení možnosti zmn u parametr pedávaných funkcím ukazatelem a odkazem - volání const parametrem na míst neconst parametru (fce) - nelze int fce(const int *i) shrnutí: T T * T & je promnná daného typu je ukazatel na daný typ reference na T

14 const T T const T const * const T* T const & const T& T * const T const * const const T* const deklaruje konstantní T (const char a= b ;) deklaruje ukazatel na konstantní T deklaruje referenci na konstantní T deklaruje konstantntí ukazatel na T deklaruje konstatntní ukazatel na konstantní T 3.14 alokace pamti (no) - typov orientovaná (dynamická) práce s pamtí - klíová slova new a delete - jednotlivé promnné nebo pole promnných - alternativa k xxxalloc resp. xxxfree v jazyce C - volá konstruktory resp. destruktory - lze ve tídách petížit (volání globálních ::new, ::delete) jedna promnná void* :: operator new (size_t) void :: delete (void *) char* pch = (char*) new char; delete pch; *kk = new Komplex(10,20); // s inicializací pole void* :: operator new[ ] (size_t) void :: delete[] (void *) Komplex *pck = (char*) new Komplex [5*i]; // implicitní konstruktor pro každý prvek

15 delete[] pck; // destruktory na všechny prvky delete pck;//destruktor pouze na jeden prvek!! new T = new(sizeof(t)) = T::operator new (size_t) new T[u] = new(sizeof(t)*u+hlavika) = T::operator new[ ](size_t) new (2) T = new(sizeof(t),2) - první parametr size_t new T(v) + volání konstruktoru void T::operator delete(void *ptr) { if (zmna) Save( xxx ); if (ptr!=null) ::delete ptr; } 3.15 enum (no) - v C lze pevádt enum a int - v C je: sizeof(a) = sizeof(int) pro enum b(a); - v C++ jméno výtu jménem typu - v C++ lze piadit jen konstantu stejného typu - v C++: sizeof(a) = sizeof(b) = nkterý celoíselný typ 3.16 konstruktory a destruktory (o) { int a; //definice promnné bez konkrétní inicializace int b = 5; // definice s inicializací //vytvoení,konstrukce, na základ int hodnoty int c = b; // konstrukce (vytvoení) promnné na základ // promnné stejného typu } // konec platnosti promnných - zrušení

16 - možnost ovlivnní vzniku (inicializace) a zániku (úklid) objektu - volány automaticky pekladaem - konstruktor první volaná metoda na objekt - destruktor poslední volaná metoda na objekt Konstruktor - stejný název jako tída - nemá návratovou hodnotu - volán automaticky pi vzniku objektu (lokáln i dynamicky) - využíván k inicializaci promnných (nulování, nastavení základního stavu, alokace pamti, ) class Trida { public: Trida(void) { } Trida(int i) { } } - nkolik konstruktor petžování - implicitní (bez parametr) volá se i pi vytváení prvk polí - konverzní s jedním parametrem - kopy konstruktor vytvoení kopie objektu stejné tídy (pedávání hodnotou, návratová hodnota ) Trida(void) Trida(int i) Trida(char *c) Trida(const Trida &t) Trida(float i, float j) Trida(double i, Trida &t1) Trida a, b(5), c(b), d=b, e( ); Trida f(3.12, 8), g(8.34, b), h = 5;

17 - explicit - klíové slovo zakazuje použití konstruktoru k implicitní konverzi explicit Trida(int j) Trida::Metoda(Trida & a) int i; a.metoda ( i ); // nelze b.metoda ( Trida(i)); // lze - dynamická data ve tíd problém pi rušení - mlké a hluboké kopírování (shallow, deep copy) - vlastní kopie nebo indexované odkazy - u polí se volají konstruktory od nejnižšího indexu - konstruktor nesmí být static ani virtual - konstruktory se používají pro implicitní konverze, pouze jedna uživatelská (problémy s typy, pro které není konverze) - pokud nejsou definovány vytváí se implicitn bezparametrický jako prázdný - není-li definován kopykonstruktor, je vytvoen a provádí kopii (pamti) jedna k jedné - alespo jeden musí být v sekci public

18 Destruktor - stejný název jako tída, pedchází mu ~ - je pouze jeden (bez parametr) - nemá návratovou hodnotu - volán automaticky pekladaem - zajištní úklidu (vrácení systémových prvk, pam, soubory, ovladae, ukonení innosti HW, uložení dat ) ~Trida (void) - destruktory se volají v opaném poadí jako konstruktory - je možné ho volat jako metodu (radj ne) - není-li definován vytváí se implicitn prázdný - musí být v sekci public Objekty jiných tíd jako data tídy - jejich konstruktory se volají ped konstruktorem tídy - volají se implicitní, není-li uvedeno jinak - poadí uruje poadí v deklaraci tídy (ne poadí v konstruktoru) class Trida { int i; Trida1 a; Trida2 b; public: Trida(int i1,int i2, int i3):b(i3),a(i2),i(i1) { } } 3.17 inline funkce (no) - obdoba maker v C - pedpis pro rozvoj do kódu, není funkní volání - v hlavikovém souboru - oznaení klíovým slovem inline

19 - pouze pro jednoduché funkce (jednoduchý kód) inline int plus2(int a) {return a+2;} 3.18 Hlavikové soubory a tída (o) - hlavikový soubor (.h), inline soubor (.inl, nebo.h), zdrojový soubor (.cpp) - hlavika deklarace tídy s definicí promnných a metod, a pístupových práv ( tla inline metod lépe mimo) - pedpis - inline soubor tla inline metod -pedpis - zdrojový soubor tla metod skutený kód - soubory kde je tída používána hlavika: class T{ data metody (bez tla ) }; tla metod pímo nebo #include inl soubor inl soubor: T::tla metod návratová hodnota T::název(parametry) { } zdrojový kód: #include hlavika T::statické promnné T::statické metody T::tla metod soubory, kde je tída používána #include hlavika použití tídy

20 3.19 inline metody (o) - obdoba inline funkcí - rozbalené do kódu, pedpis - automaticky ty z tlem v deklaraci tídy - v deklaraci tídy s inline, tlo mimo - pouze hlavika v deklaraci tídy, tlo mimo (ve zdroji) není inline - obsahuje-li složitý kód (cykly) mže být inline potlaeno (pekladaem).h soubor.cpp soubor pozn. metoda() {} - inline funkce, je definováno tlo v hlavice metoda(); metoda:: není inline. Tlo je definováno mimo metoda() {} hlaviku a není uvedeno inline inline metoda(); inline metoda:: je inline z donucení pomocí klíového slova inline metoda () {} metoda (); inline metoda:: inline metoda() metoda(){} - nelze programátorskými prostedky zajistit aby nebyla inline, mže ji však peklada peložit jako neinline metoda(){} metoda:: metoda() {} špatn (mlo by dát chybu) mohlo by vést až ke vzniku dvou interpretací nkde inline a nkde funkní volání špatn mohlo by vést až ke vzniku dvou interpretací nkde inline a nkde funkní volání; i když je vlastní kód metody pod hlavikou takže se o inline ví, nedochází k chyb 3.20 shrnutí deklarací a definicí tíd a objekt (o)

21 - class Trida; - oznámení názvu tídy hlavika použití pouze ukazatelem - class Trida {} popis tídy promnných a metod netvoí se kód - hlavika - Trida a, *b, &c=a, d[ 10]; definice promnná dané tídy, ukazatel na promnnou, reference a pole prvk zdrojový kód - extern Trida a, *b; deklarace promnná a ukazatel - hlavika - platí stejná pravidla o viditelnosti lokálních a globálních promnných jako u standardních typ - ukazatel: na existující promnnou nebo dynamická alokace (->) - pístup k datm objektu z venku podle pístupových práv, intern bez omezení (v aktuálním objektu pes this->, nebo pímo) - pokud je objekt tídy použit s modifikátorem const, potom je nejprve zavolán konstruktor a poté teprve platí const 3.21 operátory pístupu ke lenm (o) - operátory pro pístup k uritému lenu tídy je dán pouze prototyp, reference mže být na kterýkoli prvek tídy odpovídající prototypu - využití napíklad pi prchodu polem a prací s jednou promnnou -.* dereference ukazatele na len tídy pes objekt - ->* dereference ukazatele na len tídy pes ukazatel na objekt - nejdou petypovat (ani na void) - pi použití operátoru.* a -> je prvním operandem vlastní objekt tídy T, ze kterého chceme vybraný prvek použít int (T::*p1) (void); // definice operátoru pro pístup k metod // bez parametr vracející int ze tídy T p1=&t::f1; // inicializace pístupu na konkrétní // metodu int T::f1(void) float T::*p2;

22 // definice operátoru pro pístup k // promnné p2=&t::f2; // inicializace pístupu na konkrétní // promnnou zatím nemáme objekt ani // ukazatel na nj pouze definici tídy T tt,*ut=&tt; ut->*p2=3.14; (ut->*p1)();//volání fce závorky pro prioritu tt.*p2 = 4; tt.*p1( ) 3.22 deklarace tídy uvnit jiné tídy (o) - jméno vnoené tídy je lokální - vztahy jsou stejné jako by byly definovány nezávisle (B mimo A) - jméno se deklaruje uvnit, obsah vn - použití pro pomocné objekty které chceme skrýt class A { class B; // deklarace (názvu) vnoené tídy... } class A::B { // vlastní definice tla tídy... } A::B x; // objekt tídy B definován vn 3.23 const a metody (o) - const u parametr nepedávat hodnotou, ochrana proti nechtnému pepisu hodnot - const parametry by nemly být pedávány na míst neconst

23 - na const parametry nelze volat metody, které je zmní kontrola peklada - metody, které nemní objekt je nutno oznait jako const a takto oznaené metody lze volat na const objekty float f1(void) const { } 3.24 prototypy funkcí (no) - v C nepovinné uvádt deklaraci (ale nebezpené) implicitní definice - v C++ musí být prototyp pesn uveden (parametry, návrat) - není-li v C deklarace (prototyp) potom se má za to, že vrací int a není informace o parametrech - void fce( ) v C++ je bez parametr tj. void fce(void) - void fce( ) je v C (neurená funkce) funkce s libovolným potem parametr (void fce( )) - void fce(void) v C bez parametr 3.25 friend funkce (o) - klíové slovo friend - zaruuje pístup k private len pro nelenské funkce i tídy - friend se neddí - porušuje ochranu dat, (zrychluje práci) class Tída { friend complex; friend double f(int); // tída komplex a globální funkce f mohou // pistupovat i k private lenm Tídy. } zdrojový kód friend funkce a tídy je mimo a nenese informaci o tíd ke které patí (nemá this )

24 3.26 funkce s promnným potem a typem parametr (no) výpustka int fce (int a, int b, ); - v C nemusí být, uvedeno - v C++ musí být, uvedeno - u parametr uvedených v ásti nedochází ke kontrole typ 3.27 typ bool (no) - nový typ pro reprezentaci logických promnných - klíová slova bool a true a false (konstanty pro hodnoty) - implicitní konverze mezi int a bool (0 => false, nenula => true, false => 0, true => 1) - v C pomocí define nebo enum 3.28 petížení operátor (no) - je možné petížit i operátory (tj. definovat vlastní) - klíové slovo operátor následované typem operátoru - deklarace pomocí funkního volání nap. int operator +(int ) {} - možnost volat funkn i = operator+( j ) nebo zkrácen i = +j - operátorem je i vstup a výstup do streamu, new a delete - hlavní využití u objekt operátory (o) - operátory lze v C++ petížit stejn jako metody - správný operátor je vybrán podle seznamu parametr (a dostupných konverzí), rozliší peklada podle kontextu - operátory unární mají jeden parametr promnnou se kterou pracují, nebo this - operátory binární mají dva parametry dv promnné, se kterými pracují nebo jednu promnnou a this

25 - unární operátory: +, -, ~,! - binární +,-,*,/,%,=,^,&,&&,,,>,<,>=,==, +=,*=,<<,>>,<<=, - ostatní operátory [ ], ( ), new, delete - operátory matematické a logické - nelze petížit operátory: sizeof,? :, ::,.,.* - nelze zmnit poet operand a pravidla pro asociativitu a prioritu - nelze použít implicitních parametr - slouží ke zpehlednní programu - snažíme se aby se petížené operátory chovaly podobn jako pvodní (nap. nemní hodnoty operand, + sítá nebo spojuje ) - klíové slovo operátor - operátor má plné (funkní) a zkrácené volání z = a + b z.operator=(a.operator+(b)) - nejprve se volá operátor + a potom operátor = - funkní zápis slouží i k definování operátoru T T::operator+(T & param) {} T operator+(double d, T&param) {} Unární operátory - mají jeden parametr (u tíd this) - napíklad + a complex & operator+(void) complex operator-(void) - operátor plus (+aaa) nemní prvek a výsledkem je hodnota tohoto (vn metody existujícího) prvku proto lze vrátit referenci což z úsporných dvod dláme - operátor mínus (-aaa) nemní prvek a výsledek je záporná hodnota proto musíme vytvoit nový prvek vracíme hodnotou

26 - operátory ++ a - - mají prefixovou a postfixovou notaci - definice operátor se odliší (fiktivním) parametrem typu int - je-li definován pouze jeden, volá se pro ob varianty - nkteré pekladae ob varianty neumí ++( void) s voláním ++x ++( int ) s voláním x++ argument int se nevyužívá Binární operátory - mají dva parametry (u tídy je jedním z nich this) - napíklad + complex complex::operator+ (complex & c) complex complex::operator+ (double c) complex operator+ (double f,complex & c) a + b a.operator+(b) a a.operator+(3.14) a operator+(3.14,a) - výstupní hodnota rzná od vstupní vrácení hodnotou - mohou být petížené - lze petížit i globální (druhý parametr je tída) asto friend - opt kolize pi volání (implicitní konverze) - parametry s (jako u standardních operátor) nemní a tak by mly být oznaeny const, i metoda by mla být const Operátor = - ml by (díky kompatibilit) vracet hodnotu - obzvlášt zde je nutné ošetit pípad a = a

27 - pro innost s dynamickými daty nutno ošetit mlké a hluboké kopie - vytváí se implicitn (mlká kopie pesná kopie 1:1) - nadefinování zamezí vytvoení implicitního = - je-li v sekci private, pak to znamená, že nelze použít (extern) T& operator=(t const& r) musí umožovat a = b = c = d = ; Zpsoby piazení string * a,* b; a = new string; b = new string; a = b ; delete a ; delete b ; - pouze piazení ukazatel, oba ukazatele sdílí stejný objekt (stejná statická i dynamická data) - chyba pi druhém odalokování, protože odalokováváme stejný objekt podruhé string {int delka; char *txt} string a, b( ahoj ); a = b ; delete a ; // volá peklada delete b ;

28 - je vytvoeno a tedy použito implicitní = - ukazatel txt ukazuje na stejná dynamická data (statické promnné jsou zkopírovány, ale dále se používají nezávisle) - pokud je nadefinován destruktor, který odalokuje txt (což by ml být), potom zde odalokováváme pamt, kterou odalokoval již destruktor pro prvek a string {int delka; char *txt;operator =();} string a, b( ahoj ); a = b ; delete a ; delete b ; - použito nadefinované = - v = se provede kopie dat pro ukazatel txt - oba prvky mají svoji kopii dat statických i dynamických - každý prvek si odalokovává svoji kopii Konverzní operátory - pevod objekt na jiné typy - využívá peklada pi implicitních konverzích - opaný smr jako u konverzních konstruktor - napíklad konverze na standardní typy int, double - nemá návratovou hodnotu (je dána názvem) - nemá parametr operator typ(void) T::operator int(void) volán implicitn nebo T aaa; int (aaa) ; (int) aaa; // starý typ - nepoužívat

29 Petížení funkního volání - mže mít libovolný poet parametr - takto vybaveným objektm se íká funkní objekty - nedoporuuje se ho používat operator ()(parametry ) double& T::operator()(int i,int j) { } T aaa; double d = aaa(4,5); d = aaa.operator()(5,5); aaa(4,4) = d; Petížení indexování - podobn jako operátor( ) ale má pouze jeden operand (je to tedy binární operátor) - nejastji používán s návratovou hodnotou typu reference (l-hodnota) double& T::operator[ ](int ) aaa[5] = 4; d = aaa.operator[ ](3); petížení pístupu k prvkm tídy - je možné petížit -> - musí vracet ukazatel na objekt tídy pro kterou je operátor -> definován protože: TT* T::operator->( param ) { } x -> m; // je totéž co (x.operator->( ) ) -> m; 3.30 statické metody (o) - pouze jedna na tídu

30 - nemá this - ve tíd oznaená static - vlastní tlo ve zdrojové ásti - nesmí být virtuální - (jako friend funkce, mže k private lenm) - externí volání se jménem tídy bez objektu Tída::fce( ) class Tída { static int fce (void); } 3.31 mutable (o) - oznaení promnných tídy, které je možné mnit i v const objektu - statická data nemohou být mutable class X { public : mutable int i ; int j ; } class Y { public: X x; } const Y y ; y. x. i ++ ; y. x. j ++ ; mže být zmnn chyba 3.32 prostory jmen (no) - oddlení názv promnných - identifikátor - zabránní kolizí stejných jmen (u rzných programátor) - pidává píjmení ke jménu prostor::identifikátor prostor::podprostor::identifikátor

31 - pi použití má pednost nejbližší identifikátor - klíové slovo namespace vyhrazuje (vytváí) prostor s daným jménem - vytváí blok spolených funkcí a dat oddlení od zbytku - pístup do jiných prostor pes celý název promnné - klíové slovo using zpístupuje v daném prostoru identifikátory i celé prostory skryté v jiném prostoru - umožní neuvádt píjmení pi pístupu k promnným z jiného prostoru - doporuuje se zpístupnit pouze vybrané funkce a data (ne celý prostor) - dotažení promnné koní s koncem bloku ve kterém je uvedeno nap. je-li cout v prostoru std, pak správný pístup je std::cout z našeho programu. Použijeme-li na zaátku modulu using namespace std, pak to znamená, že k promnným z prostoru std mžeme pistupovat pímo a tedy psát cout (a ten se najde) lépe je být konkrétní a tedy using std::cout definice namespace { promnné funkce tídy } pomocí using BázováTída::g; lze ve zddné tíd zpístupnit prvek který se ztratil (byl pekryt i je nepístupný) 3.33 znakové konstanty, dlouhé literály (no) - typ pro ukládání znakových promnných vtších než char (UNICODE) tj. dlouhé znakové konstanty - znaky (char) již proto nejsou konvertovány na int

32 - v C je sizeof( a ) = sizeof(int) v C++ je = sizeof(char) - w_char, wchar_t - wchar_t b = L a ; - wchar_t c[20] = L abcd ; - existují pro nj nové funkce a vlastnosti napíklad wprintf( ), wcin, wcout, MessageBoxW( ) - zatím brán jako problematický typ 3.34 typ long long (no) - nový celoíselný typ s danou minimální pesností 64 bit unsigned long long int lli = LLU; printf( %lld,lli); 3.35 restrict (no) - nové klíové slovo v jazyce C, modifikátor (jako const ) u ukazatele - z dvod optimalizací rychlejší kód (možnost umístit do cache i registru) - íká, že daný odkaz (ukazatel) je jediným, který je v daném okamžiku namíen na data - to je - data nejsou v daném okamžiku pístupna pes jiný ukazatel data - to je - data se nemní - const eší pouze pístup pes daný ukazatel, ne pes jiné (lze const i neconst ukazatel ne jednu promnnou) -- pulsem 3.36 Vstupy a výstupy v jazyce C++ - petížení (globálních) operátor << a >> - typov orientovány

33 - knihovní funkce (ne klíová slova) - vstup a výstup je zajišován pes objekty, hierarchie tíd - knihovny xxxstream - napojení na soubor, pam, standardní (seriové) zaízení - standardní vstupy a výstupy (streamy) cin, cout, cerr, clog, wcin, wcout, wcerr, wclog - díve definováno pomocí metod, nyní pomocí šablon, díve pracuje s bytem, nyní šablona (tedy obecný typ, nap. složitjší znakové sady) práce se streamy - vstup a výstup základních typ pes konzolu - formátování základních typ - práce se soubory - implementace ve tídách - obecná realizace streamu vstup a výstup pes konzolu - petíženy operátory << a >> pro základní typy - výbr na základ typu promnné - peddefinován cout, cin, cerr, clog (+ w ) - knihovna iostream - zetzení díky návratové hodnot typu stream - vyprázdnní (pípadného) bufferu flush, endl ( \n +flush), ends ( \0 +flush) cin >> i >> j >> k; cout << i << text << j << k << endl; stream & operator xx (stream &, Typ & p) { } - naítá se promnný poet znak gcount zjistí kolik - vypouštní bílých znak pepínae ws, noskipws, skipws (vynechá bílé znaky, nepeskakuje, peskakuje BZ na zaátku)

34 - natení celého ádku getline(kam,maxkolik) te celý ádek, get(kam, maxkolik) te ádek bez odádkování - natení znaku get te všechny znaky, zastaví se na bílém znaku - put uložení znaku (Pouze jeden znak bez vlivu formátování) - vrácení znaku putback - vytení znaku tak aby zstal v zaízení peek - int i,j; cout << zadejte dv celá ísla /n ; cin>> i>> j; cout<< \n <<i<< / <<j<< = <<double(i)/j<<endl; formátování základních typ - je možné pomocí modifikátor, manipulátor nebo nastavením formátovacích bit - ovlivnní tvaru, pesnosti a formátu výstupu - mže být v iomanip.h - petížení operátor << a >> pro parametr typu manip, nebo pomocí ukazatel na funkce - pesnost výsledku má pednost ped nastavením - manipulátory - funkce pracující s typem stream mají stream & jako parametr i jako návratovou hodnotu - slouží bu pro nastavení nové, nebo zjištní stávající hodnoty - nkteré psobí na jeden (následující) výstup, jiné trvale - bity umístny ve tíd ios (staré streamy), nov v ios_base kde jsou spolené vlastnosti pro input i output, které nezávisí na templatové interpretaci (ios) - nastavení bit pomocí setf s jedním parametrem (vrátí souasné) - setf se dvma parametry nastavení bitu + nulování ostatních bit ve skupin (oznaení bitu, oznaení spolené skupiny bit)

35 - nulování bit unsetf - nkdy (díve) setioflags, resetioflags, flags - pro uchování nastavení bit je peddefinován typ fmtflags - i = os.width(j) šíka výpisu, pro jeden znak, default 0 - os << setw(j) << i; - i = os.fill(j) výplový znak, pro jeden výstup, default mezera - os<<setfill(j) << i; - ios_base::left, ios_base::right, left, right - zarovnání vlevo vpravo fmtlags orig = os.setf(ios_base::left,ios_base::adjustfield) manipulátory bity nastaví i nulují - ios_base::internal, internal znaménko zarovnáno vlevo, íslo vpravo - bity left, right, internal patí do skupiny ios_base::adjustfield - ios_base::showpos, manipulátor showpos, noshowpos zobrazí vždy znaménko (+, -) - ios_base::uppercase, uppercase, nouppercase zobrazení velkých i malých písmen v hexa a u exponentu - ios_base:: dec,ios_base::hex, ios_base::oct, dec, oct, hex pepínání formát tisku (bity patí do skupiny ios_base::basefield) - setbase nastavení soustavy - ios_base::showbase, showbase, noshowbase tisk 0x u hexa - ios_base::boolalpha, boolalpha, noboolalpha tisk true, false - os.precision(j) nastavení pesnosti, významné íslice, default 6 - os<<setprecision(j) << i - ios_base::showpoint, showpoint, noshowpoint nastavení tisku desetinné teky - ios_base::fixed, fixed desetinná teka bez exponentu - ios_base::scientific, scientific exponenciální tvar - bity fixed, scientific patí do ios_base::floatfield - eatwhite peskoení mezer, writes tisk etzce práce se soubory - podobné mechanizmy jako vstup a výstup pro konzolu

36 - petížení operátor >> a << - fstream, ofstream, ifstream, iofstream - objekty vytváí se konstruktorem, zanikají destruktorem - první parametr název otevíraného souboru - lze otevít i metodou open, zavít metodou close - metoda is_open pro kontrolu otevení (u MS se vztahuje na vytvoení bufferu a pro test otevení se doporuuje metoda fail() ) oftream os( nazev souboru ); os << vystup ; os.close( ); os.open( jiny soubor.txt ); if (!os.is_open()) - druhý parametr udává typ otevení, je definován jako enum v ios - ios::in pro tení - ios::out pro zápis - ios:: ate po otevení nastaví na konec souboru - ios::app pro otevení (automaticky out) a zápis (vždy) za konec souboru - ios::binary práce v binárním tvaru - ios::trunc vymaže existující soubor - ios::nocreate oteve pouze existující soubor (nevytvoí) - ios::noreplace oteve pouze když vytváí (neoteve existující) ofstream os( soub.dat, ios::out ios::ate ios::binary ios::nocreate ); istream is( soub.txt, ios::in ios::nocreate); fstream iostr( soub.txt, ios::in ios::out);

37 - zjištní konce souboru metoda eof ohlásí až po natení prvního za koncem souboru - zjišování stavu bity stavu ios::io_state - goodbit v poádku - badbit vážná chyba (nap. chyba zaízení, ztráta dat linky, peplnný buffer ) problém s bufferem (HW) - failbit - mén závažná chyba, naten špatný znak (nap. znak písmene místo íslice, neoteven soubor ) problém s formátem (daty) - eofbit dosažení konce souboru - zjištní pomocí metod good( ), bad( ),fail( ), eof( ) - zjištní stavu - if(is.rdstate()&(ios::badbid ios::failbit)) - smazání nastaveného bitu (po chyb, i po dosažení konce souboru) pomocí clear(bit) - pi chyb jsou i výjimky basic_ios::failure. Výjimku je možné i nastavit pro clear pomocí exceptions (iostate ist) - práce s binárním souborem write(bufer, kolik), read(bufer, kolik) - pohyb v souboru seekp (pro výstup) a seekg (pro vstup), parametrem je poet znak a odkud (ios:_base:cur, ios_base::end, ios_base::beg) - zjištní polohy v souboru tellp (pro výstup) a tellg (pro vstup) - ignore pro pesun o daný poet znak, druhým parametrem mže být znak, na jehož výskytu se má pesun zastavit. na konci souboru se koní automaticky - implementace ve tídách - tída je nový typ aby se chovala standardn petížení << a >> pro streamy - istream& operator >> (istream &s, komplex &a ) { char c = 0;

38 s >> c; // levá závorka s >>a.re>>c;//reálná složka a oddlovací árka s>>im>>c;//imaginární složka a konená závorka return s; } ostream &operator << (ostream &s, komplex &a ) { s << ( << a.real <<, << a.imag << ) ; return s; } template<class chart, class Traits> basic_ostream<chart, Traits> & operator <<(basic_ostream <chart, Traits>& os, const Komplex & dat) obecná realizace - streamy jsou realizovány hierarchií tíd, postupn pibírajících vlastnosti - zvláš vstupní a výstupní verze - ios obecné definice, vtšina enum konstant (pesunuty do ios_base), bázová tída nezávislá na typu ios.h - streambuf tída pro práci s bufery buto standardní, nebo v konstruktoru dodat vlastní (pro file ddí filebuf, pro pam strstreambuf, pro konzolu conbuf )(streamy se starají o formátování, bufery o transport dat), pro nastavení (zjištní) buferu rdbuf - istream, ostream ješt bez buferu, už mají operace pro vstup a výstup (petížené << a >>) iostream.h - iostream = istream + ostream (obousmrný) - ifstream, ofstream pro práci s diskovými soubory, automaticky buffer, fstream.h

39 - istrstream, ostrstream, strstream pro práci s etzci, pam pro práci mže být parametrem konstruktoru strstream.h - tídy xxx_withassign rozšíení (istream, ostream), pidává schopnost pesmrování (nap. do souboru, ) cin, cout - constream tída pro práci s obrazovkou, clrscr pro mazání, window pro nastavení aktuálního výezu obrazovky - nedoporuuje se dlat kopie, nebo piazovat streamy - stav streamu je možné kontrolovat i pomocí if (!sout), kdy se používá petížení operátoru!, které je ekvivalentní sout.fail(), nebo lze použít if (sout), které používá petížení operátoru () typu void *operator (), a který vrací!sout.fail(). (tedy nevrací good ) Shrnutí tíd //======= komplex2214p.cpp - kód aplikace ============ #include "komplex2214.h" char str1[]="(73.1,24.5)"; char str2[]=" i"; int main () { Komplex a; Komplex b(5),c(4,7); Komplex d(str1),e(str2); Komplex f=c,g(c); Komplex h(12,35*3.1415/180.,komplex::euhel); Komplex::TKomplexType typ = Komplex:: euhel; Komplex i(10,128*3.1415/180,typ);

40 d.priradsoucet(b,c); e.prirad(d.prirad(c)); d.priradsoucet(5,c); d.priradsoucet(komplex(5),c); e = a += c = d; a = +b; c = -d; d = a++; e = ++a; if (a == c) a = 5; else a = 4; if (a > c) a = 5; else a = 4; if (a >= c) a = 5; else a = 4; b = ~b; c = a + b + d; c = 5 + c; int k = int (c); int l = d; float m = e; // pozor - pouije jedinou monou konverzi a to pes int //?? bool operator&&(komplex &p) {} if (a && c) // musi byt implementovan - neni-li konverze (nap. zde // se prohákuje pes konverzi int, kde je && definovana) e = 8; // u komplex nesmysl Komplex n(2,7),o(2,7),p(2,7);

41 n*=o; p*=p; // pro první realizaci n*=n je výsledek n a p rzny i kdy // vstupy jsou stejné if (n!=p) return 1; return 0; } //======= komplex2214.h - hlavika tídy ============ // trasujte a divejte se kudyma to chodi, tj. zobrazte *this,... // objekty muzete rozlisit pomoci indexu #ifndef KOMPLEX_H #define KOMPLEX_H #include <math.h> struct Komplex { enum TKomplexType {eslozky, euhel}; static int Poradi; static int Aktivnich; double Re,Im; int Index; Komplex(void) {Re=Im=0;Index = Poradi;Poradi++;Aktivnich++; } inline Komplex (double re,double im=0, TKomplexType kt = eslozky); Komplex(const char *txt); inline Komplex(const Komplex &p); ~Komplex(void) {Aktivnich--;} void PriradSoucet(Komplex const &p1,komplex const &p2) {Re=p1.Re+p2.Re;Im=p1.Im+p2.Im;}

42 Komplex Soucet(const Komplex & p) {Komplex pom(re+p.re,im+p.im);return pom;} Komplex& Prirad(Komplex const &p) {Re=p.Re;Im=p.Im;return *this;} double faktorial(int d) {double i,p=1; for (i=1;i<d;i++) p*=i; return p; } double Amplituda(void)const { return sqrt(re*re + Im *Im);} bool JeMensi(Komplex const &p) {return Amplituda() < p.amplituda();} double Amp(void) const; bool JeVetsi(Komplex const &p) {return Amp() > p.amp();} // operatory Komplex & operator+ (void) {return *this;} // unární +, me vrátit sám sebe, vrácený prvek je totoný s prvkem, // který to vyvolal Komplex operator- (void) {return Komplex(-Re,-Im);} // unární -, musí vrátit jiný prvek ne je sám Komplex & operator++(void) {Re++;Im++;return *this;} // nejdív pite a pak vrátí, take me vrátit sám sebe

43 // (pro komplex patrn nesmysl) Komplex operator++(int) {Re--;Im--;return Komplex(Re-1,Im-1);} //vrací pvodní prvek, take musí vytvoit jiný pro vrácení Komplex & operator= (Komplex const &p) {Re=p.Re;Im=p.Im;return *this;} // bez const v hlavice se neprelozi nektera prirazeni, // implementováno i zetzení Komplex & operator+=(komplex &p) {Re+=p.Re;Im+=p.Im;return *this;} // návratový prvek je stejný jako ten, který to vyvolal, take se dá // vrátit sám bool operator==(komplex &p) {if ((Re==p.Re)&&(Im==p.Im)) return true;else return false;} bool operator> (Komplex &p) {if (Amp() > p.amp()) return true;else return false;} // me být definováno i jinak bool operator>=(komplex &p) {if (Amp() >=p.amp()) return true;else return false;} Komplex operator~ (/*Komplex &p*/ void) {return Komplex(Re,-Im);} // bylo by dobré mít takové operátory dva jeden, který by zmnil sám // prvek a druhý, který by prvek nemnil Komplex& operator! () {Im*=-1;return *this;}; // a tady je ten operátor

44 // co mní prvek. Problém je, e je to nestandardní pro tento operátor // a zárove se mohou plést. Take bezpenj í je nechat jen ten první // bool operator&&(komplex &p) {} Komplex operator+ (Komplex &p) {return Komplex(Re+p.Re,Im+p.Im);} Komplex operator+ (float f) {return Komplex(f+Re,Im);} Komplex operator* (Komplex const &p) {return Komplex(Re*p.Re-Im*p.Im,Re*p.Im + Im * p.re);} Komplex &operator*= (Komplex const &p) // zde je nutno pouít pomocné promnné, protoe // je nutné pouít v obou piazeních ob promnné {double pre=re,pim=im; Re=pRe*p.Re-Im*p.Im;Im=pRe*p.Im+pIm*p.Re; return *this;} // ale je to patn v pípad, e pouijeme pro a *= a;, potom první // piazení zmní i hodnotu p.re a tím nakopne výpoet druhého // parametru (! i kdy je konst!) // {double pre=re,pim=im,ore=p.re; // Re=pRe*p.Re-Im*p.Im;Im=pRe*p.Im+pIm*oRe;return *this;} // verze ve ktere pepsání Re sloky ji nevadí // friend Komplex operator+ (float f,komplex &p); //není nutné // pokud nejsou privátní promnné operator int(void) {return Amp();} };

45 inline Komplex::Komplex(double re,double im, TKomplexType kt ) { Re=re; Im=im; Index=Poradi; Poradi++; Aktivnich++; if (kt == euhel) {Re=re*cos(im);Im = Re*sin(im);} } Komplex::Komplex(const Komplex &p) { Re=p.Re; Im=p.Im; Index=Poradi; Poradi++; Aktivnich++; } #endif //======= komplex2214.cpp - zdrojový kód tídy ============ // trasujte a divejte se kudyma to chodi, tj. zobrazte *this,... // objekty muzete rozlisit pomoci indexu #include "komplex2214.h" int Komplex::Poradi=0; int Komplex::Aktivnich=0; Komplex::Komplex(const char *txt)

46 { /* vlastni alg */; Re=Im=0; Index = Poradi; Poradi++; Aktivnich++; } double Komplex::Amp(void)const { return sqrt(re*re + Im *Im); } Komplex operator+ (float f,komplex &p) { return Komplex(f+p.Re,p.Im); } urení datum zkoušek ddní - znovupoužití kódu (s drobnými zmnami) - odvození tíd z již existujících - pevzetí a rozšíení vlastností, sdílení kódu - dodání nových promnných a metod - pekrytí pvodních promnných a metod (zstávají) - pvodní tída bázová, nová odvozená - pi ddní se mní pístupová práva promnných a metod bázové tídy v závislosti na zpsobu ddní - class C: public A A je bázová tída, public znaí zpsob ddní a C je název nové tídy

47 - zpsob ddní u tídy je implicitn private (a nemusí se uvádt), u struktury je to public (a nemusí se uvádt) class C: D - tabulka ukazuje jak se pi rzném zpsobu ddní mní pístupová práva bázové tídy (A) ve tíd zddné class A class B:private A class C:protected A class D:public A public a private a protected a public a private b protected c private c protected c protected c - nová tída má vše co mla pvodní. K ní lze pidat nová data a metody. Stejné metody v nové tíd pekryjí pvodní mají pednost (pvodní se dají stále zavolat). - postup volání konstruktor - konstruktor bázové tídy, konstruktory lokálních promnných (tídy) v poadí jak jsou uvedeny v hlavice, konstruktor (tlo) dané tídy - destruktory se volají v opaném poadí než konstruktory class Base { int x; public: float y; Base( int i ) : x ( i ) { }; // zavolá konstruktor tídy a pak promnné, // x(i) je kontruktor pro int } class Derived : Base { public: int a ; Derived ( int i ) : a ( i*10 ) : Base (a) { } // volání lokálních konstruktoru umožní // konstrukci podle požadavk, ale nezmní

48 // poadí konstruktor Base::y; // je možné takto vytáhnout // promnnou (zddnou zde do sekce private) // na jiná pístupová práva (zde public) } class base { base (int i=10) } class derived:base { complex x,y;. public: defived() : y(2,1) {f() } volá se base::base() complex::complex(void) - pro x complex::complex(2,1) pro y f() - vlastní tlo konstruktoru - neddí se: konstruktory, destruktory, operátor = - ukazatel na potomka je i ukazatelem na pedka - implicitní konstruktor v private zabrání ddní, tvorbu polí - destruktor v private zabrání ddní a vytváení instancí - kopyponstruktor v private zabrání pedávání (a vracení) parametru hodnotou - operátor = v private zabrání piazení 4.2 vícenásobné ddní - lze ddit i z více objekt najednou - problémy se stejnými názvy nutno rozlišit - problémy s vícenásobným ddním stejných tíd - virtual - nelze ddit dvakrát ze stejné tídy na stejné úrovni C:B,B

49 A: public L B: public L C: public A, Public B L L A B C v C je A::a a B::a A: virtual V B: virtual V C: public A, public B (konstruktor V se volá pouze jedenkrát) V A B C X: virtual public B Y: virtual public B Z: public B AA: public X, Y, Z

50 B B X Y Z AA 4.3 virtuální metody Virtuální metody - zajišují tzv. pozdní vazbu, tj. zjištní adresy metody až za bhu programu pomocí tabulky virtuálních metod, - tvm - se vytváí voláním konstruktoru. - V klasickém programování je volaná metoda vybrána již pi pekladu pekladaem na základ typu promnné, funkce i metody, která se volání úastní. - U virtuálních metod není dležité emu je promnná piazena, ale jakým zpsobem vznikla pi vzniku je jí dána tabulka metod, které se mají volat. Tato tabulka je souástí prvku. - jsou-li v bázové tíd definovány metody jako virtual, musí být v potomcích identické - ve zddných tídách není nutné uvádt virtual - metoda se stejným názvem, ale jinými parametry se stává nevirtuální, tedy statickou - pokud je virtual v odvozené tíd a parametry se liší, pak se virtual ignoruje - virtuální metody fungují nad tídou, proto nesmí být ani static ani friend - i když se destruktor neddí, mže být virtuální - Využívá se v situaci kdy máme dosti píbuzné objekty, potom je možné s nimi jednat jako s jedním (Nap. výkres, kresba objekty mají parametry, metody jako posun, rotace, data Krom toho i metodu kresli na vykreslení objektu)

51 - Spolené rozhraní není teba znát pesn tídu objektu a je zajištno (pi bhu programu) volání správných metod protože rozhraní je povinné a plyne z bázové tídy. - Virtuální f-ce umožují dynamickou vazbu (late binding) vyhledání správné funkce až pi bhu programu. - Rozdíl je v tom, že se zjistí pi pekladu, na jakou instanci ukazatel ukazuje a zvolí se viruální funkce. Neexistuje-li vyhledává se v rodiovských tídách. - Musí souhlasit parametry funkce. - Ukazatel má vlastn dv ásti dynamickou danou typem, pro který byl definován a statickou která je dána typem na který v dané chvíli ukazuje. - Není-li metoda oznaena jako virtuální použije se statická (tj. volá se metoda typu kterému je práv piazen objekt). - je-li metoda virtuální, použije se dynamická vazba je zaazena funkce pro zjištní až v dob innosti programu zjistit dynamickou kvalifikaci. vazba (tj. volá se metoda typu pro který byl vytvoen objekt) - zavolat metody dynamické klasifikace pes tabulku odkaz virtuální tídy - Pi vytvoení virtuální metody je ke tíd pidán ukazatel ukazující na tabulku virtuálních funkcí. - Tento ukazatel ukazuje na tabulku se seznamem ukazatel na virtuální metody tídy a tíd rodiovských. pi volání virtuální metody je potom použit ukazatel jako bázová adresa pole adres virtuálních metod. - Metoda je reprezentována indexem, ukazujícím do tabulky. - Tabulka odkaz se ddí. Ve zddné tabulce pepíší se adresy pedefinovaných metod, doplní nové položky, žádné položky se nevypouští. Nevirtuální metoda pekrývá virtuální - Máme-li virtuální metodu v bázové tíd, musí být v potomcích deklarace identické. Konstruktory nemohou být virtuální, destruktory ano.

52 - Virtual je povinné u deklarace a u inline u definice. - ve zddných tídách není nutn uvádt virtual - stejný název a jiné parametry nevirtuální statická vazba (v dalším odvození opt virtual) - pokud je virtual v odvozené tíd a parametry se liší virtual se ignoruje - protože virualní f-ce fungují nad tídou, nesmí být virtual friend, ani static - i když se destruktor neddí, destruktor v ddné tíd petíží (zruší) virtuální - virtuální funkce se mohou lišit v návratové hodnot, pokud tyto jsou vi sob v ddické relaci isté virtuální metody - pokud není vitruální metoda definována (nemá tlo), tak se jedná o istou virtuální metodu, která je pouze deklarována - obsahuje-li objekt istou virtuální metodu, nemže být vytvoena jeho instance, mže být ale vytvoen jeho ukazatel. deklarace : class base {... virtual void fce ( int ) = 0; } - virtuální metoda nemusí být definována v tom pípad hovoíme o ist viruální metod, musí být deklarována. - chceme využít jednu tídu jako Bázovou, ale chceme zamezit tomu, aby se s ní pracovalo. Mžeme v konstruktoru vypsat hlášku a exitovat. istjší je ovšem, když na to pijde peklada tj. použít ist virtuální metody - deklarace vypadá: virtual void f (int)=0 (nebo =NULL) - tato metoda se ddí jako ist virtuální, dkud není definována - starší pekladae vyžadují v odvozené tíd novou deklaraci a nebo definici

53 - obsahuje-li objetk.v.m. nelze vytvoit jeho instanci, mže být ale ukazatel class B { public: virtual void vf1() {cout << b ;} void f() {cout<< b ;} class C:public B{ void vf1(){cout << c ;} // virtual nepovinne void f() {cout << c ;}} class D: public B { void vf1() { void vf1() {cout<< d ;} void f() {cout << d ;}} B b; C c;d d; b.f(); c.f(); d.f(); // vola normalni metody tridy / tisk b c d protože promenne jsou typu B C D / prekladac b.vf1();c.vf1();d.vf1(); // vola virtualni metody tridy / tisk b c d protože promenne vznikly jako B C D/ runtime B* bp = &c; // ukazatel na bazovou tridu (prirazeni muze byt i v ifu, a pak se nevi co je dal) Bp->f(); // vola normalni metodu tridy B / tisk b, protože promenna je typu B / prekladac bp -> vf1(); // vola virtualni metodu / tisk c protože promenna vznikla jako typ c / runtime 4.4 abstraktní bázové tídy - má alespo jednu istou virtuální metodu (C++ pístup) - neuvažuje se o jejím použití (tvorba objektu) - obecn tída, která nemá žádnou instanci (objektový pístup) - slouží jako spolená výchozí tída pro potomky - tvorba rozhraní class x {

54 } public: virtual void f()=0; virtual void g()=0; void h() ; X b; // nelze class Y: x { void f() ; } Y b; opet nelze class Z: Y{ void t(); } Z c; uz jde c.h() z x c.f() z y c.g() z Z 4.5 šablony (template) - umožují psát kód pro obecný typ - vytvoí se tak návod (pedpis, šablona) na základ které se konkrétní kód vytvoí až v pípad poteby pro typ, se kterým se má použít - umisuje se do hlavikového souboru (pedpis, netvoí kód) - template <class T> T max ( T &h1, T &h2 ) { return (h1>h2)? h1 : h2 ;

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

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

Vstupy a výstupy v jazyce C++

Vstupy a výstupy v jazyce C++ Vstupy a výstupy v jazyce C++ - jazyk C++ dává možnost řešit vstup a výstup proměnných (na V/V zařízení) podstatně elegantněji než jazyk C. Tyto mechanizmy se postupně vyvíjejí, v poslední době využívají

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

PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory

PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory Výhody objektového řešení Nástroje pro IO operace jsou v C++ součástí knihoven Hierarchie objektových

Více

1. Úvod www.uamt.feec.vutbr.cz/~richter (vyuka/1011_ppc/bppc) 2.1 Opakování programování

1. Úvod www.uamt.feec.vutbr.cz/~richter (vyuka/1011_ppc/bppc) 2.1 Opakování programování 1. Úvod www.uamt.feec.vutbr.cz/~richter (vyuka/1011_ppc/bppc) - starší materiály stále na síti, kombinovaný KPPC další příklady - cvičící a přednášející - rovnocenní - organizace přednášek a cvičení -

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

Datové proudy objektový vstup a výstup v C++

Datové proudy objektový vstup a výstup v C++ Datové proudy objektový vstup a výstup v C++ Petr Šaloun 10. listopadu 2014 PJCPP Objektový vstup/výstup 10-1 Datové proudy objektový vstup a výstup v C++ Základní pojmy Znakje elementární textová informace,

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

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

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

PB161 Programování v jazyce C++ Přednáška 5 PB161 Programování v jazyce C++ Přednáška 5 Jmenné prostory Vstupní/výstupní proudy Nikola Beneš 19. října 2015 PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 1 / 29 Jmenné

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

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

Každý datový objekt Pythonu má minimáln ti vlastnosti. Identitu, datový typ a hodnotu.

Každý datový objekt Pythonu má minimáln ti vlastnosti. Identitu, datový typ a hodnotu. Datový objekt [citováno z http://wraith.iglu.cz/python/index.php] Každý datový objekt Pythonu má minimáln ti vlastnosti. Identitu, datový typ a hodnotu. Identita Identita datového objektu je jedinený a

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

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

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

Sestavení programu v C/C++, preprocesor, makra

Sestavení programu v C/C++, preprocesor, makra 1. Úvod www.uamt.feec.vutbr.cz/~richter - starší materiály, KPPC - cvičící a přednášející - organizace přednášek a cvičení - konzultace a dotazy - hodnocení - literatura Sestavení programu v C/C++, preprocesor,

Více

Prostory jmen. při vkládání několika hlavičkových souborů může vzniknout kolize. logika.h const int x=5; typedef struct {...

Prostory jmen. při vkládání několika hlavičkových souborů může vzniknout kolize. logika.h const int x=5; typedef struct {... Proudy v C++ Jmenné prostory Prostory jmen při vkládání několika hlavičkových souborů může vzniknout kolize zeleznice.h const int x=10; typedef struct {... } Hradlo; logika.h const int x=5; typedef struct

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

PÍRUKA A NÁVODY PRO ÚELY: - RUTINNÍ PRÁCE S DATY

PÍRUKA A NÁVODY PRO ÚELY: - RUTINNÍ PRÁCE S DATY PÍRUKA A NÁVODY PRO ÚELY: - RUTINNÍ PRÁCE S DATY YAMACO SOFTWARE 2006 1. ÚVODEM Nové verze produkt spolenosti YAMACO Software pinášejí mimo jiné ujednocený pístup k použití urité množiny funkcí, která

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

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

PB161 Programování v jazyce C++ Přednáška 6 PB161 Programování v jazyce C++ Přednáška 6 Přátelství Přetěžování operátorů Vstup a výstup Nikola Beneš 23. října 2018 PB161 přednáška 6: přátelství, přetěžování operátorů, vstup/výstup 23. října 2018

Více

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

PB161 Programování v jazyce C++ Přednáška 6 PB161 Programování v jazyce C++ Přednáška 6 Přátelství Přetěžování operátorů Vstup a výstup Nikola Beneš 23. října 2018 PB161 přednáška 6: přátelství, přetěžování operátorů, vstup/výstup 23. října 2018

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

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

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

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

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

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

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

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

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

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

JAZYK C++ ÚVOD. Historie. Syntaktické definice v p!ednáškách. Deklarace a definice

JAZYK C++ ÚVOD. Historie. Syntaktické definice v p!ednáškách. Deklarace a definice 1. p!ednáška JAZYK C++ ÚVOD Historie Jazyk C++ je objektov" orientovaným rozší!ením jazyka C. Autor C++ Bjarne Stroustrup z firmy AT&T Bell Laboratories. Rok 1982 Stroustrup rozší!il jazyk C o objekty

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

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

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

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

PROGRAMOVÁNÍ V C++ URČENO PRO VZDĚLÁVÁNÍ V AKREDITOVANÝCH STUDIJNÍCH PROGRAMECH ROSTISLAV FOJTÍK

PROGRAMOVÁNÍ V C++ URČENO PRO VZDĚLÁVÁNÍ V AKREDITOVANÝCH STUDIJNÍCH PROGRAMECH ROSTISLAV FOJTÍK PROGRAMOVÁNÍ V C++ URČENO PRO VZDĚLÁVÁNÍ V AKREDITOVANÝCH STUDIJNÍCH PROGRAMECH ROSTISLAV FOJTÍK ČÍSLO OPERAČNÍHO PROGRAMU: CZ.1.07 NÁZEV OPERAČNÍHO PROGRAMU: VZDĚLÁVÁNÍ PRO KONKURENCESCHOPNOST OPATŘENÍ:

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

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

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++ 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

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

Ú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

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný typem proměnné - ukazatel je tedy adresa společně s

Více

Jazyk C++ I. Šablony

Jazyk C++ I. Šablony Jazyk C++ I Šablony AR 2013/2014 Jazyk C++ I Úvod Zatím známe programovací styly: Strukturované programování, Objektově orientované programovaní. AR 2013/2014 Jazyk C++ I 2 Příklady void Print(const int&

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

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++ C++ Akademie SH 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory Za áte níci C++ 20. b ezna 2011 Obsah 1 Prom nné - primitivní typy Celá ísla ƒísla s pohyblivou desetinnou árkou, typ bool 2 Podmínka

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

Promnné. [citováno z

Promnné. [citováno z Promnné [citováno z http://wraith.iglu.cz/python/index.php] Abychom s datovým objektem mohli v programu njak rozumn pracovat, potebujeme se na nj njakým zpsobem odkázat. Potebujeme Pythonu íct, aby napíklad

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

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N Struktura (union) - struktura a union jsou složené typy, které "v sobě" mohou obsahovat více proměnných - struktura obsahuje v každém okamžiku všechny své proměnné, union obsahuje (=je "aktivní") pouze

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

Datové typy pro reálná čísla

Datové typy pro reálná čísla Datové typy pro reálná čísla KAPITOLA 3 V této kapitole: Vlastnosti datových typů pro reálná čísla v jazyce C/ C++ Vstupně/výstupní operace z pohledu reálných čísel Aritmetické operace s reálnými čísly

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

Zpracoval: houzvjir@fel.cvut.cz

Zpracoval: houzvjir@fel.cvut.cz Zpracoval: houzvjir@fel.cvut.cz 9. Datový typ ukazatel, přetěžování funkcí, typ reference, vstup a výstup, třídy, staticky vázané metody, dědění, dynamicky vázané metody, abstraktní třídy, polymorfní datové

Více

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

C++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19 C++ přetěžování funkcí a operátorů 1 Přetěžování funkcí jazyk C++ umožňuje napsat více funkcí se stejným názvem, těmto funkcím říkáme přetížené přetížené funkce se musí odlišovat typem nebo počtem parametrů,

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

Ú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

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

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

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

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

NMIN201 Objektově orientované programování 1 / :36:09 NMIN201 Objektově orientované programování 1 / 26 8.10.2013 15:36:09 Objekty Svět se skládá z objektů! konkrétní x abstraktní hmatatelné x nehmatatelné (letadlo) x (chyba v programu) Objekty mohou obsahovat

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

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

18. února 2015, Brno Připravil: David Procházka. Programovací jazyk C++

18. února 2015, Brno Připravil: David Procházka. Programovací jazyk C++ 18. února 2015, Brno Připravil: David Procházka Vstupní a výstupní proudy v C++ Programovací jazyk C++ Vstup dat do programu Strana 2 / 26 Obsah přednášky 1 Vstup dat do programu 2 Terminál 3 Textový soubor

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

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

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

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

NPRG031 Programování II 1 / :25:46 NPRG031 Programování II 1 / 26 28. 2. 2018 11:25:46 Objekty Svět se skládá z objektů! konkrétní x abstraktní hmatatelné x nehmatatelné (letadlo) x (chyba v programu) Objekty mohou obsahovat jiné objekty

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

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

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

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

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

Chování konstruktorů a destruktorů při dědění Dědičnost V objektově orientovaném programování je dědičnost způsob, jak vytvořit novou třídu použitím již existujících definic jiných tříd. Takto vytvořené třídy přebírají vlastnosti a metody svého předka

Více

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

C++ objektově orientovaná nadstavba programovacího jazyka C C++ objektově orientovaná nadstavba programovacího jazyka C (1. část) Josef Dobeš Katedra radioelektroniky (13137), blok B2, místnost 722 dobes@fel.cvut.cz 5. května 2014 České vysoké učení technické v

Více

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

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech 7 Formátovaný výstup, třídy, objekty, pole, chyby v programech 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 formátovanému výstupu,

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

Opakování programování

Opakování programování Opakování programování HW návaznost - procesor sběrnice, instrukční sada, optimalizace rychlosti, datové typy, operace (matematické, logické, podmínky, skoky, podprogram ) - paměti a periferie - adresování

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

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) Třídy v C++

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++ Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++ Třídy v C++ Třídy jsou uživatelsky definované typy podobné strukturám v C, kromě datových položek (proměnných) však mohou obsahovat i funkce

Více

Paměť počítače. alg2 1

Paměť počítače. alg2 1 Paměť počítače Výpočetní proces je posloupnost akcí nad daty uloženými v paměti počítače Data jsou v paměti reprezentována posloupnostmi bitů (bit = 0 nebo 1) Připomeňme: paměť je tvořena řadou 8-mi bitových

Více

Objektově orientované programování

Objektově orientované programování 10. října 2011 Pragmatické informace Volitelný předmět, zápočet: zápočtový program(s dokumentací), aktivní účast na cvičení(body v CodExu), praktický test, zkouška: zkoušková písemka na objektový návrh

Více

katedra informatiky FEI VB-TU Ostrava 10. jna 2005 etr aloun (katedra informatiky FEI VB-TU Ostrava) Dal vrazy 10. jna / 25

katedra informatiky FEI VB-TU Ostrava 10. jna 2005 etr aloun (katedra informatiky FEI VB-TU Ostrava) Dal vrazy 10. jna / 25 Vrazy, dokonen Petr aloun katedra informatiky FEI VB-TU Ostrava 10. jna 2005 etr aloun (katedra informatiky FEI VB-TU Ostrava) Dal vrazy 10. jna 2005 1 / 25 vraz sloen z opertor a operand C++: kad opertor

Více

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje f1(&pole[4]); funkci f1 předáváme hodnotu 4. prvku adresu 4. prvku adresu 5. prvku hodnotu 5. prvku symbolická konstanta pro konec souboru je eof EOF FEOF feof Správné vytvoření a otevření textového souboru

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

Ú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

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

PROGRAMOVÁNÍ V C++ CVIČENÍ PROGRAMOVÁNÍ V C++ CVIČENÍ INFORMACE Michal Brabec http://www.ksi.mff.cuni.cz/ http://www.ksi.mff.cuni.cz/~brabec/ brabec@ksi.mff.cuni.cz gmichal.brabec@gmail.com PODMÍNKY ZÁPOČTU Základní podmínky společné

Více

Objektově orientované programování. Úvod

Objektově orientované programování. Úvod Objektově orientované programování Úvod Imperativní programovací styl klasický programovací styl používaný v době vzniku prvních vyšších programovacích jazyků těžiště programování je v tvorbě algoritmů

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

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

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

PB přednáška (19. října 2015) PB161 5. přednáška (19. října 2015) Jmenné prostory Motivace problém: výskyt dvou entit (např. tříd) se stejným jménem typicky nenastává uvnitř jednoho projektu použití více nezávislých knihoven příp.

Více

Formátová specifikace má tvar (některé sekce nemají smysl pro načítání) %

Formátová specifikace má tvar (některé sekce nemají smysl pro načítání) % vstup a výstup na konzolu - vstupním zařízením je klávesnice, výstupním monitor (přístup jako k sériovým zařízením) - spojení s konzolami je nastaveno automaticky na začátku programu - ke konzole je možné

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

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

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek 8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek 1/41 Základní příkazy Všechny příkazy se píšou malými písmeny! Za většinou příkazů musí být středník (;)! 2/41 Základní příkazy

Více