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



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

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

Vstupy a výstupy v jazyce C++

Virtuální metody - polymorfizmus

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

1. Úvod (vyuka/1011_ppc/bppc) 2.1 Opakování programování

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

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

konstruktory a destruktory (o)

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

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

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

Programování v jazyce C a C++

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

Objektové programování

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

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

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

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

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

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

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

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

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

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

Více o konstruktorech a destruktorech

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

Zápis programu v jazyce C#

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

Dědění, polymorfismus

PREPROCESOR POKRAČOVÁNÍ

Jazyk C++ I. Šablony 2

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

Programování v jazyce C a C++

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

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

Funkční objekty v C++.

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

Konstruktory a destruktory

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

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

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

Generické programování

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

Jazyk C++ I. Polymorfismus

Úvod do programovacích jazyků (Java)

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ý

Jazyk C++ I. Šablony

Mělká a hluboká kopie

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

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

Promnné. [citováno z

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

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

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

Datové typy pro reálná čísla

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

Zpracoval:

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

Ukazka knihy z internetoveho knihkupectvi

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

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

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

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

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

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

Odvozené a strukturované typy dat

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

Úvod do programování. Lekce 1

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

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

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

Výrazy, operace, příkazy

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

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/

Abstraktní třídy, polymorfní struktury

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

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

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

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

Opakování programování

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

Algoritmizace a programování

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

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

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

Objektově orientované programování

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

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

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

Úvod do programovacích jazyků (Java)

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

Objektově orientované programování. Úvod

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

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

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

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

Data, výrazy, příkazy

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

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

Transkript:

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

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 - email - 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ší

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

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

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

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

// 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;

} // 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, 34.54 ); 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

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

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

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

- 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

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

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

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í

- 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( 101001 ); Trida f(3.12, 8), g(8.34, b), h = 5;

- 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

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

- 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

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)

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

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

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

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

- 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

- 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 + 3.14 a.operator+(3.14) 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

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

- 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

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

- 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

- 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

- 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 = 1234533224LLU; 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

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

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

- 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

- 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);

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

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

- 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 ). 3.37 Shrnutí tíd //======= komplex2214p.cpp - kód aplikace ============ #include "komplex2214.h" char str1[]="(73.1,24.5)"; char str2[]="23+34.2i"; 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);

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);

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;}

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

// (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

// 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();} };

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)

{ /* 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 ---- ---- ---- 4.1 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

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

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

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

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)

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

- 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

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

} 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 ;