18. unora ´ 2015, Brno ´ Pˇripravil: David Prochazka
´ ´ ı v C++ Zaklady programovan´ Programovac´ı jazyk C++
Historie C++: od Fortranu po C++11
ˇ Obsah pˇredna´ sky 1
Historie C++: od Fortranu po C++11
2
´ Pˇripomenut´ı zaklad u˚ OOP v C++
3
Pˇreklad aplikace
4
ˇ e´ a prace ´ s nimi Promenn
5
ˇ abn´ ´ ı kultura St
6
Const
7
Static
8
Override a final
9
Oddechnut´ı
Strana 2 / 53
Historie C++: od Fortranu po C++11
Strana 3 / 53
Trocha historie nikoho nezabije... ´ Na poˇcatku bylo slovo, to slovo bylo... Fortran Lze ho povaˇzovat za jeden z prvn´ıch programovac´ıch ´ jazyku˚ souˇcasneho typu“. ” ´ ´ ı Dodnes je jeho nova´ verze pouˇz´ıvana pro programovan´ ruzn´ ˚ ych matematick´ych uloh. ´ Jazyku˚ postupneˇ pˇrib´yvalo... Simula, Cobol, LISP, Prolog, Smalltalk, C... Fortran inspiroval Algol, Algol CPL, CPL BPL, BCPL, BCPL B, B C
Historie C++: od Fortranu po C++11
Strana 4 / 53
Jazyk C ˇ y jazyk. N´ızkourov ´ nov´ ´ Systemov´ y jazyk. ´ Operaˇcn´ı systemy, pˇrekladaˇce, drivery. ´ e´ moˇznosti d´ıky knihovnam. ´ Rozsahl ´ zena´ rychl´ym a elegantn´ım Niˇzsˇ ´ı efektivita v´yvoje vyvaˇ ´ kodem a velk´ymi moˇznostmi. Implementace OOP podle Smalltalku – Objective C.
Historie C++: od Fortranu po C++11
Strana 5 / 53
Jazyk C++ ´ ˇ ren na OOP. Od zakladu zameˇ Rychlejˇs´ı v´yvoj aplikac´ı oproti C. Spousta IDE – Code::Blocks, Microsoft Visual Studio, Eclipse, Qt Creator, XCode (MacOS X) . . . a pˇrekladaˇcu˚ GCC, LLVM, IBM, Ms Vzor pro dalˇs´ı OO jazyky – Java, C#.
Historie C++: od Fortranu po C++11
Historie C/C++ 1972 Ritchie, Thomson (pro OS Unix) 1978 specifikace Ritchie, Kerninghan 1984 prvn´ı standardizace ANSI C 1990 definitivn´ı standardizace ANSI C 1980 C with Classes (prvn´ı pokus o budouc´ı C++) 1983 C++ 1998, 2003 standardizace ANSI/ISO C++ 2011 standardizace C++11 (dˇr´ıve C++0x)
Strana 6 / 53
Historie C++: od Fortranu po C++11
Strana 7 / 53
C++11 Kompatibilita s C++98, ´ ´ tenk´y zaklad rozˇs´ıˇren´y zejmena prostˇrednictv´ım STL, ´ s hadwarem, duraz na v´ykon a pˇr´ımou praci ˚ ´ ´ ´ ´ ı, zlepˇsen´ı v´ıcevlaknov eho a generickeho programovan´ ˇ poˇzadovane´ vlastnosti konkurence: rozsahove´ doplneny for cykly, podpora UTF-8/16/32. . . ´ ı nove´ elegantn´ı konstrukce: lambda v´yrazy, regularn´ ´ v´yrazy, silneˇ typove´ v´ycˇ ty, uˇzivatelem definovane´ literaly atp. http://en.wikipedia.org/wiki/C++11
Historie C++: od Fortranu po C++11
Strana 8 / 53
´ ı volbou? Je uˇz C++ idealn´ NE ´ ı univerzaln´ ´ ı jazyk neexistuje. Idealn´ ˇ y jazyk obsahuj´ıc´ı vetˇ ˇ sinu Ale Je to stabiln´ı, odladen´ ´ modern´ıch“ nastroj u. ˚ ” ´ Je podporovan´y prakticky na vˇsech platformach. ˇ y, je rychl´y. Aˇckoliv je relativneˇ vysokourov ´ nov´ ´ ı textu. Nehod´ı se na vˇsechno – napˇr. zpracovan´ ˚ Nen´ı tak pohodln´y“ – mj. silneˇ typov´y. ”
´ Pˇripomenut´ı zaklad u˚ OOP v C++
ˇ Obsah pˇredna´ sky 1
Historie C++: od Fortranu po C++11
2
´ Pˇripomenut´ı zaklad u˚ OOP v C++
3
Pˇreklad aplikace
4
ˇ e´ a prace ´ s nimi Promenn
5
ˇ abn´ ´ ı kultura St
6
Const
7
Static
8
Override a final
9
Oddechnut´ı
Strana 9 / 53
´ Pˇripomenut´ı zaklad u˚ OOP v C++
´ ı aplikace Pˇripomenut´ı trivialn´ 1 2 3 4 5 6 7
class Car { private : // soukroma cast string m_model ; public : // verejne rozhrani Car ( string model ){ // konstruktor m_model = model ; }
8
string getModel (){ return m_model ; }
9 10 11 12
void setModel ( string model ){ m_model = model ; }
13 14 15 16
};
Strana 10 / 53
´ Pˇripomenut´ı zaklad u˚ OOP v C++
Strana 11 / 53
´ ı aplikace Pˇripomenut´ı trivialn´ 1 2 3
int main ( void ) { // vytvoreni promenne s ukazatelem Car * ford ;
4
// vytvoreni objektu a prirazeni uk . ford = new Car ( " Fiesta " );
5 6 7
// volani metody cout << " Model : " << ford - > getModel ();
8 9 10
// smazani objektu na ktery ford ukazuje delete ford ;
11 12 13
// predani OS informaci o korektnim konci aplikace return 0;
14 15 16
}
´ Pˇripomenut´ı zaklad u˚ OOP v C++
Strana 12 / 53
Staticke´ a dynamicke´ instance tˇr´ıd ´ ´ ı funkc´ı, Zasobn´ ık (Stack) je oblast vyuˇz´ıvana´ pro volan´ ´ an´ ´ ı navratov´ ´ ´ ıch uklad ych adres, parametru˚ funkce a lokaln´ ˇ ych. promenn´ ´ ´ na uklad ´ an´ ´ ı lokaln´ ´ ıch promenn´ ˇ ych, Zasobn´ ık je koncipovan nen´ı vhodn´y pro objemna´ data. Pro ty je halda (heap). ´ ı a uvolnov ˇ an´ ´ ı pameti ˇ na V jazyce C slouˇz´ı k alokovan´ haldeˇ funkce malloc(), resp. free(). V C++ jsou zde pak ´ operatory new a delete.
´ Pˇripomenut´ı zaklad u˚ OOP v C++
Strana 13 / 53
Staticke´ a dynamicke´ instance tˇr´ıd ´ ´ ilustruje vytvoˇren´ı promenn ˇ e´ ukazatel na Nasleduj´ ıc´ı kod ´ ˇ Objekt zasobn´ ıku, ktera´ ukazuje na objekt alokovan´y na halde. lze kdykoliv vytvoˇrit a zruˇsit. 1 2 3 4 5
Car * ukazatel ; ukazatel = new Car ; ukazatel - > metoda (); delete ukazatel ; ukazatel = new Car ;
// // // // //
vytvor promennou s ukaz . vloz adresu objektu zavolani metody smaz objekt za ukazatelem a dosadime opet jiny
´ ´ ilustruje vytvoˇren´ı promenn ˇ e´ objekt na Nasleduj´ ıc´ı kod ´ zasobn´ ıku, ktera´ pˇr´ımo obsahuje hodnotu objektu. Objekt je ´ ı promennou, ˇ lokaln´ tedy zanikne automaticky na konci metody, ale nen´ı moˇzne´ jej explicitneˇ zruˇsit. 1 2 3
Car objekt ; // vytvorime promennou s obj . objekt . metoda (); // opet volame metodu Car objekt2 ( parametr ); // zavolani par . konst .
´ Pˇripomenut´ı zaklad u˚ OOP v C++
Strana 14 / 53
ˇ abn´ ´ ı kultura St ´ Odsazujte tak, aby byla patrna´ struktura kodu (ale nepˇrepisujte). ´ ´ Delku rˇadku udˇzujte na rozumne´ velikosti (ale nepˇrepisujte) ´ Pojmenovavejte jednotn´ym zpusobem tˇr´ıdy (Trida, ˚ ˇ e´ (mojeInstance), metody JinaTrida), promenn (vypisInformace nebo VypisInformace), atributy ˇ e´ tˇr´ıdy (s promTridy), globaln´ ´ ı (m mujAtribut), promenn ˇ e´ (fuj, ale g pocet) atp. promenn ´ e´ a jasne´ metody – princip Keep It Stupid Piˇste kratk Simple. ˇ m´ıt pouze jeden uˇ Kaˇzda´ entita by mela ´ cel.
´ Pˇripomenut´ı zaklad u˚ OOP v C++
Strana 15 / 53
Prostory jmen ˇ e´ a pˇr´ıpadneˇ dalˇs´ı nastroje ´ Tˇr´ıdy, ale i promenn C++ lze tˇr´ıdit do skupin – prostoru˚ jmen. Smyslem je logicky rozˇclenit aplikaci a vyhnout se ´ ım duplicitam ´ v oznaˇcen´ı. potencialn´ ´ ıch aplikac´ı. Nema´ smysl vyuˇz´ıvat u trivialn´ ´ ˇ s´ıch Vyuˇz´ıvame pˇri tvorbeˇ knihoven nebo komplexnejˇ aplikac´ı. ´ ´ ´ Pro identifikaci jmenneho prostoru pouˇz´ıvame operator :: nebo deklaraci using namespace. ´ Existuje implicitn´ı prostor jmen, kter´y nema´ jmeno. Podle ANSI C++ existuje standardn´ı prostor jmen std, tam ´ patˇr´ı mnoho nastroj u. ˚
´ Pˇripomenut´ı zaklad u˚ OOP v C++
Implicitn´ı a standardn´ı prostory jmen 1
using namespace std ;
2 3 4 5
class Foo { ... };
6 7 8 9 10 11 12
int main ( void ) { Foo * ukazatel = new Foo (); ukazatel - > metoda (); delete ukazatel ; return 0; }
Strana 16 / 53
´ Pˇripomenut´ı zaklad u˚ OOP v C++
Pˇr´ıklad prostoru jmen 1 2 3 4 5
namespace JmennyProstor { class Foo { ... }; }
6 7 8 9
class Foo { ... };
Strana 17 / 53
´ Pˇripomenut´ı zaklad u˚ OOP v C++
Pouˇzit´ı prostoru jmen 1 2 3 4 5
int main ( void ) { JmennyProstor :: Foo * ukazatel1 = new JmennyProstor :: Foo (); ukazatel1 - > metoda (); delete ukazatel1 ;
6
Foo * ukazatel2 = new Foo (); ukazatel2 - > metoda (); delete ukazatel2 ;
7 8 9 10
return 0;
11 12
}
Strana 18 / 53
´ Pˇripomenut´ı zaklad u˚ OOP v C++
ˇ ı pouˇzit´ı direktivy using Dals´ 1 2 3 4 5
int main ( void ) { // import v ramci metody / funkce using namespace std ; ... }
nebo 1 2 3 4 5
// import jedineho prikazu using std :: cout ; ... int main ( void ) { ...
Strana 19 / 53
Pˇreklad aplikace
ˇ Obsah pˇredna´ sky 1
Historie C++: od Fortranu po C++11
2
´ Pˇripomenut´ı zaklad u˚ OOP v C++
3
Pˇreklad aplikace
4
ˇ e´ a prace ´ s nimi Promenn
5
ˇ abn´ ´ ı kultura St
6
Const
7
Static
8
Override a final
9
Oddechnut´ı
Strana 20 / 53
Pˇreklad aplikace
Strana 21 / 53
Pˇreklad 1 2
´ a´ zdrojov´y soubor .cc (.cpp) preprocesor – pˇredzpracovav (include, defined). ´ ı pˇreklad zdrojoveho ´ ´ kompilator – pˇrekladaˇc provad´ souboru ´ adresy promenn´ ˇ ych a fc´ı .OBJ (.o) relativn´ı strojov´y kod, ´ nejsou znamy .LIS protokol o pˇrekladu
3
ˇ ı linker – sestavovac´ı program provede pˇridelen´ absolutn´ıch adres .EXE, spustiteln´y soubor
´ ´ Je doporuˇcovano kompilovat pˇri vysoke´ citlivosti kompilatoru (c++ -Wall -pedantic -o program program.cc). Pro pˇreklad C++11 mus´ıte take´ zvolit knihovnu libc++ (-std=c++0x -stdlib=libc++). V XCode je nalezneme pod nastaven´ım C++ Standard Library a C++ Language Dialect.
Pˇreklad aplikace
Strana 22 / 53
Pˇreklad v´ıce souboru˚ ˇ s´ıch projektu˚ je zvykem rozdelovat ˇ ´ do v´ıce U vetˇ kod souboru. ˚ Obvykle pro kaˇzdou tˇr´ıdu vytvoˇr´ıme samostatn´y hlaviˇckov´y (.h) a implementaˇcn´ı (.cc) soubor. ´ a´ pomoc´ı direktiv Hlavn´ı soubor programu (main.cc) vklad include pouze hlaviˇckove´ soubory modulu˚ (nikdy ´ any ´ samostatne. ˇ implementaˇcn´ı soubory). Ty jsou pˇreklad c++ ./main.cc ./lev.cc ./zirafa.cc -o zookoutek
Pˇreklad aplikace
Strana 23 / 53
ˇ ˇ e´ Hlavickov e´ soubory a jejich podm´ınen ˇ nacten´ ı Hlaviˇckove´ soubory vˇzdy obsahuj´ı veˇskere´ direktivy include nezbytne´ pro samostatn´y pˇreklad modulu (tˇr´ıdy). Implementaˇcn´ı soubor (.cc) obsahuje pouze implementace neˇsablonov´ych metod a jedinou direktivu include, ktera´ vloˇz´ı hlaviˇckov´y soubor dane´ tˇr´ıdy. ´ v´ıcekrat. ´ je Hlaviˇckove´ soubory jsou cˇ asto includovany ´ jejich v´ıcenasobn ´ ´ nutne´ zabranit emu naˇcten´ı. ˇ eho ´ K tomu slouˇz´ı definice podm´ınen bloku: Pokud blok ´ ´ ´ nadefinuj ho. kodu s t´ımto jmenem nebyl definovan, 1 2 3 4
# ifndef _MEDVED_H # define _MEDVED_H // samotny obsah souboru medved . h # endif
ˇ e´ a prace ´ Promenn s nimi
ˇ Obsah pˇredna´ sky 1
Historie C++: od Fortranu po C++11
2
´ Pˇripomenut´ı zaklad u˚ OOP v C++
3
Pˇreklad aplikace
4
ˇ e´ a prace ´ s nimi Promenn
5
ˇ abn´ ´ ı kultura St
6
Const
7
Static
8
Override a final
9
Oddechnut´ı
Strana 24 / 53
ˇ e´ a prace ´ Promenn s nimi
Strana 25 / 53
´ Datove´ typy (cˇ ast) ´ Zakladn´ ı ´ int, long int, short int, long long Celoˇc´ıselne: ´ e: ´ float, double, long double Realn ˇ Znaky a ˇretezce: char[16 t| 32 t], string. ´ ı: void, auto Specialn´
´ z´ı na dane´ architektuˇre. Zjist´ıme pomoc´ı Velikosti typu zaleˇ pˇr´ıkazu sizeof(int) nebo konstant INT MAX INT MIN, aj. ´ ı Specialn´ ´ Zaznam, union, v´ycˇ tov´y typ enumerate, v´ycˇ tova´ tˇr´ıda, pole (inicializace int pole[3], resp. int pole[3] = {1,2,3}1 , pˇr´ıstup pole[0]) ´ STL: seznam, fronta, zasobn´ ık, ...
´ U celoˇc´ıseln´ych typu˚ existuj´ı take´ neznamenkov e´ varianty ˇ unsigned. C´ıseln´y rozsah posunut pouze do kladn´ych cˇ ´ısel. 1
moˇznost vloˇzen´ı objektu˚ { { 1,2,3 },... }
ˇ e´ a prace ´ Promenn s nimi
Strana 26 / 53
Kontrola rozsahu 1 2 3 4 5 6 7 8 9 10 11 12 13 14
# include < climits > using namespace std ; ... int main (){ cout << " int is " << sizeof ( int ) << " B " << endl ; cout << " short : " << sizeof ( short ) << " B " << endl ; cout << " long : " << sizeof ( long ) << " B " << endl ; cout << " Maximum values : " << endl ; cout << " int : " << INT_MAX << endl ; cout << " short : " << SHRT_MAX << endl ; cout << " long : " << LONG_MAX << endl ; cout << " Minimum int value = " << INT_MIN << endl ; return 0; }
ˇ e´ a prace ´ Promenn s nimi
Strana 27 / 53
Typy s garantovanym ´ rozsahem (C++11) ´ Znamenkov y´ int o pˇresne´ bitove´ velikosti int8 t, int16 t, int32 t, int64 t uint8 t, uint16 t, uint32 t, uint64 t Rychla´ (nativn´ı) implementace int fast8 t, int fast16 t, int fast32 t, int fast64 t uint fast8 t, uint fast16 t, uint fast32 t, uint fast64 t ´ eˇ pameti ˇ Implementace zab´ıraj´ıc´ı nejmen int least8 t, int least16 t, int least32 t, int least64 t uint least8 t, uint least16 t, uint least32 t, uint least64 t
ˇ e´ a prace ´ Promenn s nimi
ˇ e´ slovo auto (C++11) Kl´ıcov ´ Automaticky se dosad´ı typ na zaklad eˇ inicializace. Nepouˇz´ıvat pokud nen´ı typ zˇrejm´y! 1 2
int x = 10; auto y = x ; // y je int
Strana 28 / 53
ˇ e´ a prace ´ Promenn s nimi
Strana 29 / 53
ˇ ych Deklarace a inicializace promenn ´ typ jmeno = inicializacni hodnota 1 2 3 4 5 6
int i = 1; // globalni promenna int main ( void ) { int j = 10; // lokalni prom . int & ref = j ; // reference na j , nutno hned inic . return 0; }
ˇ a´ by mela ˇ m´ıt co nejmenˇs´ı moˇznou platnost. Promenn Pˇri vytvoˇren´ı prom. je vˇzdy vhodne´ ji okamˇziteˇ inicializovat.
ˇ e´ a prace ´ Promenn s nimi
Strana 30 / 53
ˇ ych In-class inicializace promenn ´ (C++11) Dˇr´ıve: 1 2 3 4 5 6 7 8
int var = 7; class X { static const int m1 = 7; // ok const int m2 = 7; // error : not static static int m3 = 7; // error : not const static const int m4 = var ; // error : init . not const static const string m5 = " odd " ; // error : not integr };
Nyn´ı inicializace v dobeˇ pˇrekladu: 1 2 3
class X { int m_a = 7; };
ˇ e´ a prace ´ Promenn s nimi
Strana 31 / 53
Konstruktory: inicializace v dobeˇ pˇrekladu In-class inicializace je ekvivalent 1 2 3 4 5
class A { int m_a ; public : A () : m_a (7) {} };
Tento zpusob inicializace atributu˚ je nezbytn´y pokud atributem ˚ je objekt, kter´y nema´ bezparametrick´y konstruktor 1 2 3 4 5 6
class Vektor { Bod m_x ; Bod m_y ; public : Bod ( Bod x , Bod y ): m_x ( x ) , m_y ( y ){...} };
ˇ e´ a prace ´ Promenn s nimi
Strana 32 / 53
´ ı konstruktoru˚ Konstruktory: delegovan´ (C++11) Dˇr´ıve: 1 2 3 4 5 6 7 8 9
class Bod { int m_x ; validate ( int x ) { if (0 < x && x <= max ) a = x ; else ...} public : Bod ( int x ) { validate ( x ); } Bod () { validate (42); } Bod ( string s ) { int x = lexical_cast < int >( s ); validate ( x );} };
Nyn´ı: 1 2 3
class Bod { ... Bod ( int x ) { validate ( x ); }
ˇ e´ a prace ´ Promenn s nimi
Pˇr´ıklad metody vracej´ıc´ı jednu hodnotu 1 2 3 4 5 6 7
class Vypocet { public : int secti ( int cislo1 , int cislo2 ){ return cislo1 + cislo2 ; } }; ...
8 9 10 11 12
int int int int
x y a b
= = = =
12; 45; objekt - > secti (a , b ); objekt - > secti (10 ,12);
Strana 33 / 53
ˇ e´ a prace ´ Promenn s nimi
Strana 34 / 53
Vracen´ı v´ıce hodnot Situace se lehce komplikuje, pokud potˇrebujeme vracet z metody v´ıce hodnot. ´ Mame 2 moˇznosti, jak to realizovat: pomoc´ı ukazatelu˚ (*) nebo refenc´ı (&). Subjektivneˇ jednoduˇzsˇ ´ı je: 1 2 3 4 5 6 7 8 9
class Vymena { public : void vymen ( int &a , int & b ){ int pom = a ; a = b ; b = pom ; } }; ... objekt - > vymen (a , b );
ˇ e´ a prace ´ Promenn s nimi
Strana 35 / 53
Vracen´ı v´ıce hodnot – varianta * 1 2 3 4 5 6 7 8
class Vymena { public : void vymen ( Student *a , Student * b ){ Student pom = a ; a = b; b = pom ; } };
9 10 11 12 13
int main ( void ){ Student * karel = new Student ( " Karel " , 11) Student * pepa = new Student ( " Pepa " , 11) objekt - > vymen ( karel , pepa );
ˇ ´ ´ je Casto je doporuˇcovano spojit hodnoty do jedne´ tˇr´ıdy a vratit pomoc´ı return. Napˇr. m´ısto x a y vracet instanci Bod2D s vlastnostmi x a y.
ˇ abn´ ´ ı kultura St
ˇ Obsah pˇredna´ sky 1
Historie C++: od Fortranu po C++11
2
´ Pˇripomenut´ı zaklad u˚ OOP v C++
3
Pˇreklad aplikace
4
ˇ e´ a prace ´ s nimi Promenn
5
ˇ abn´ ´ ı kultura St
6
Const
7
Static
8
Override a final
9
Oddechnut´ı
Strana 36 / 53
ˇ abn´ ´ ı kultura St
Strana 37 / 53
ˇ abn´ ´ ı kultura parametru˚ St ´ ame ´ ´ ı vestaven ˇ e´ typy. Hodnotou pˇredav trivialn´ ˇ b´yt Parametry, ktere´ slouˇz´ı pouze pro vstup by meli oznaˇceny const. Pokud se jedna´ o ukazatele na prom. je velmi doporuˇcene´ oznaˇcit je const. Reference (&) se pouˇz´ıva´ nejen pro vracen´ı hodnoty, ale i ˇ z duvodu efektivity. Reference na vstupn´ı promennou by ˚ ˇ mela b´yt vˇzdy const. (nebezpeˇc´ı modifikace puvodn´ ıch ˚ dat) Napˇr: void zpracuj(const vector<string>& vec), void udelej(const Velka3DMatice& prvek) ˇ b´yt pokud moˇzno jednoduche´ typy Parametry by mely a tˇr´ıdy.
Const
Strana 38 / 53
ˇ Obsah pˇredna´ sky 1
Historie C++: od Fortranu po C++11
2
´ Pˇripomenut´ı zaklad u˚ OOP v C++
3
Pˇreklad aplikace
4
ˇ e´ a prace ´ s nimi Promenn
5
ˇ abn´ ´ ı kultura St
6
Const
7
Static
8
Override a final
9
Oddechnut´ı
Const
Strana 39 / 53
Konstanty ˇ a´ stale ´ stejnou hodnotu, Pokud ma´ m´ıt parametr nebo promenn pouˇzijte kl´ıcˇ ove´ slovo const. Pozor na odkazy: const x* zajist´ı ˇ nemennost ukazatele nikoli hodnoty. 1
const int kHeight = 10; // konstantni lokalni prom .
ˇ si nazvu. ´ Vˇsimnete B´yva´ zvykem pouˇz´ıvat pˇredponu k.
Const
Strana 40 / 53
Konstanty ´ ckove´ Nepouˇz´ıvat ceˇ #define Ma´ neomezenou platnost a nelze specifikovat typ. ´ Konstanta na urovni jmenneho prostoru: ´ const int kPageSize = 365; Konstanta na urovni tˇr´ıdy: ´ 1 2 3 4
class Window { static const int s_kWidth = 400; static const int s_kHeigth ; };
5 6
const int Window :: s_kHeigth = 300;
Const
Strana 41 / 53
ˇ ı aplikace const Dals´ const u parametru metody oznaˇcuje, zˇ e pouze vstupn´ı. ´ Pokud p´ısˇ eme const za metodou, rˇ´ıkame, zˇ e metoda ˇ ı stav objektu. nemen´ int vratHodonotuAtributu() const; V C++ lze vytvoˇrit i konstantn´ı instanci, u ktere´ nelze nijak ˇ vnitˇrn´ı stav. menit U takove´ instance lze volat pouze metody deklarovane´ s kl´ıcˇ ov´ym slovem const.
Const
Strana 42 / 53
Constexpr (C++11) ˇ constexpr umoˇznuje definovat, zˇ e funkce/metoda atp. se vyhodnocuje v dobeˇ pˇrekladu. ´ Muˇ ˚ ze v´yznamneˇ pomoci pˇri optimalizaci kodu. ˇ Funkci/metodu ale lze volat i za behu programu. Tj. nen´ı ˇ ˇreˇsen´ı pro v´ypoˇcet v dobeˇ pˇrekladu a v nutne´ oddelovat ˇ dobeˇ behu. 1 2 3
constexpr int secti ( int x , int y ){ return x + y ; }
4 5 6
// prekladac muze vyraz vyhodnotit pri prekladu const int val = secti (10 , 10);
Static
Strana 43 / 53
ˇ Obsah pˇredna´ sky 1
Historie C++: od Fortranu po C++11
2
´ Pˇripomenut´ı zaklad u˚ OOP v C++
3
Pˇreklad aplikace
4
ˇ e´ a prace ´ s nimi Promenn
5
ˇ abn´ ´ ı kultura St
6
Const
7
Static
8
Override a final
9
Oddechnut´ı
Static
Strana 44 / 53
ˇ ˇ e´ tˇr´ıdy Clensk e´ promenn Veˇskere´ atributy, ktere´ jsme doposud pouˇz´ıvali byli atributy ´ ı pro jednotlive´ objekty. objektu˚ – byly unikatn´ ´ z´ı pˇr´ımo V C++ muˇ ˚ zeme definovat i atributy, ktere´ naleˇ ´ – cˇ lenske´ promenn ˇ e. ´ tˇr´ıdam ´ Pro deklaraci atributu˚ tˇr´ıdy pouˇz´ıvame static. ´ ´ Lze k nim pˇristupovat pomoc´ı nazvu tˇr´ıdy, :: a nazvu ˇ e´ (Tˇ promenn r´ ıda::promˇ enn´ a). 1 2 3 4 5
class Trida { private : static int s_pocetInstanci ; // nelze napsat = 0; int m_normaniAtribut ; ...
Static
Strana 45 / 53
ˇ Clensk e´ metody ˇ Clensk a´ metoda (oznaˇcena static) nema´ jako svuj ˚ prvn´ı ´ protoˇze nen´ı jasne´ implicitn´ı parametr this. Je to logicke, ´ pro kter´y objekt je volana (nen´ı parametr this). ˇ metody lze pracovat jen se statick´ymi atributy a V tele metodami tˇr´ıdy. ˇ a´ instance dane´ Lze ji take´ zavolat, aniˇz by existovala nejak tˇr´ıdy. 1 2 3
static int vr atPoce tInsta nci () { return pocetInstanci ; }
Static
Strana 46 / 53
Jine´ vyuˇzit´ı static ´ ı promenn ˇ a´ (nebo funkce), je viditelna´ Je-li static globaln´ ´ souboru zdrojoveho ´ pouze v danem textu (modulu). ´ ı promenn ˇ a´ funkce, potom jej´ı hodnota je Je-li static lokaln´ ´ ana ´ ´ ım (zanika´ pˇri ukonˇcen´ı uchovav mezi jednotliv´ym volan´ programu)
Override a final
ˇ Obsah pˇredna´ sky 1
Historie C++: od Fortranu po C++11
2
´ Pˇripomenut´ı zaklad u˚ OOP v C++
3
Pˇreklad aplikace
4
ˇ e´ a prace ´ s nimi Promenn
5
ˇ abn´ ´ ı kultura St
6
Const
7
Static
8
Override a final
9
Oddechnut´ı
Strana 47 / 53
Override a final
Strana 48 / 53
Override (C++11) ´ ı metody. Explicitn´ı stanoven´ı pˇrekryt´ı virtualn´ 1 2 3 4 5 6 7
class Father { virtual void virtual void virtual void void D (); virtual void };
A ( float age ); B () const ; C (); E ();
8 9 10 11 12 13 14 15
class Son : public Father { virtual void A ( int age ) override ; // zmena typu virtual void B () override ; // predkovi const virtual void C () override ; // korekni prekryti void D () override ; // neni v predkovi virt . void E () override ; // korektni prekryti };
Override a final
Strana 49 / 53
Final (C++11) Kl´ıcˇ ov´ym slovem final oznaˇcujeme metody nebo tˇr´ıdy, ktere´ ˇ en´ ˇ ı. nesm´ı b´yt pouˇzity pro ded 1 2 3
class Father { virtual void A () final ; // nelze prekryvat };
4 5 6 7
class Son : public Father { virtual void A (); // chyba prekladace };
´ ret potomka teto ´ tˇr´ıdy. V pˇr´ıpadeˇ tˇr´ıdy nelze vytvaˇ 1
class Father final {};
2 3
class Son : public Father {}; // chyba prekladace
Override a final
Strana 50 / 53
struct vs. class ´ eˇ ˇ r pˇresneˇ toteˇ ´ z, co class. struct znamena´ v praxi tem ´ U stuct, pokud nen´ı rˇeˇceno jinak, jsou sloˇzky veˇrejne. ˇ Struktura muˇ ˚ ze b´yt pˇredkem tˇr´ıdy a opaˇcne. 1 2 3
struct Trida { ... };
4 5 6 7 8
class Trida { public : ... };
Override a final
Strana 51 / 53
ˇ Vy´ ctov a´ tˇr´ıda (enumerate class) Nahrazuje zastarale´ v´ycˇ tove´ typy, ktere´ hodnoty vnitˇrneˇ reprezentovaly jako inty. ´ ı nesouvisej´ıc´ıch hodnot. To vedlo na moˇznost porovnan´ 1 2 3
enum class Color { Red , Blue };
4 5 6 7
enum class Fruit { Banana , Apple };
8 9 10 11
Color a = Color :: Red ; // musime pouzit predponu tridy Fruit b = Fruit :: Banana ; if ( a == b ) // zde bude chyba , coz je dobre
Oddechnut´ı
ˇ Obsah pˇredna´ sky 1
Historie C++: od Fortranu po C++11
2
´ Pˇripomenut´ı zaklad u˚ OOP v C++
3
Pˇreklad aplikace
4
ˇ e´ a prace ´ s nimi Promenn
5
ˇ abn´ ´ ı kultura St
6
Const
7
Static
8
Override a final
9
Oddechnut´ı
Strana 52 / 53
Oddechnut´ı
Hello World!
Strana 53 / 53