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

Podobné dokumenty
Ukazka knihy z internetoveho knihkupectvi

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

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

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

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

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

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

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

Programovací jazyk C++ Hodina 1

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Úvod do programování. Lekce 1

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

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

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

Úvod do programovacích jazyků (Java)

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

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

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

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

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

Programování v jazyce C a C++

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

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

Lekce 6 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

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

Algoritmy I. Cvičení č. 2, 3 ALGI 2018/19

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

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

Více o konstruktorech a destruktorech

Funkční objekty v C++.

Programovací jazyk Pascal

PROGRAMOVÁNÍ V JAZYCE C V PŘÍKLADECH 11 Dynamické datové struktury 11.1 Spojové struktury Příklad PROG_

Vector datový kontejner v C++.

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

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

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

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

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

2 Datové typy v jazyce C

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

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

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

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

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

Výčtový typ strana 67

IUJCE 07/08 Přednáška č. 1

Abstraktní třídy, polymorfní struktury

PREPROCESOR POKRAČOVÁNÍ

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

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

Příkazy preprocesoru - Před překladem kódu překladačem mu předpřipraví kód preprocesor - Preprocesor vypouští nadbytečné (prázdné) mezery a řádky -

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Jazyk C++ I. Polymorfismus

Struktura programu v době běhu

Data, výrazy, příkazy

Opakování programování

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

knihovna programátora

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

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

Jazyk C Program v jazyku C má následující strukturu: konstanty nebo proměnné musí Jednoduché datové typy: Strukturované datové typy Výrazy operátory

ČÁST 1. Základy 32bitového programování ve Windows

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

Jazyk C++ II. Šablony a implementace

Objektově orientované programování

Výrazy, operace, příkazy

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

Strukturu lze funkci předat: (pole[i])+j. switch(výraz) velikost ukazatele

Jazyk C++ I. Šablony 2

DUM 06 téma: Tvorba makra pomocí VBA

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Preprocesor a koncepce (větších) programů. Úvod do programování 2 Tomáš Kühr

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

Algoritmizace a programování

Ukazatele a pole. Chceme-li vyplnit celé pole nulami, použijeme prázdný inicializátor: 207 Čárka na konci seznamu inicializátorů

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

Zápis programu v jazyce C#

DTP Základy programování Úvod do předmětu

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

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

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

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

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

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

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

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

Seminář Java II p.1/43

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

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

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/

Dědění, polymorfismus

- dělají se také pomocí #define - podobné (použitím) funkcím - předpřipravená jsou např. v ctype.h. - jak na vlastní makro:

Algoritmizace a programování

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Úvod do programování - Java. Cvičení č.4

Objektové programování

Jazyk C++ I. Polymorfismus

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.

Jazyk C++ I. Šablony

Transkript:

Upozornění pro čtenáře a uživatele této knihy Všechna práva vyhrazena. Žádná část této tištěné či elektronické knihy nesmí být reprodukována a šířena v papírové, elektronické či jiné podobě bez předchozího písemného souhlasu nakladatele. Neoprávněné užití této knihy bude trestně stíháno. Jazyky C a C++ kompletní průvodce 2., aktualizované vydání Miroslav Virius Vydala Grada Publishing, a.s. U Průhonu 22, Praha 7 jako svou 4475. publikaci Odpovědný redaktor Pavel Němeček Sazba Tomáš Brejcha Počet stran 368 První vydání, Praha 2011 Grada Publishing, a.s., 2011 V knize použité názvy programových produktů, firem apod. mohou být ochrannými známkami nebo registrovanými ochrannými známkami příslušných vlastníků. Vytiskla Tiskárna PROTISK, s.r.o., České Budějovice ISBN 978-80-247-3917-5

Obsah Předmluva.......................................................... 17 1. 2. Úvod 1.1 První program................................................ 19 1.1.1 Co je co................................................... 20 1.1.2 Překlad a sestavení........................................ 23 1.2 Programovací jazyky C a C++................................ 25 1.2.1 Standardy................................................. 26 1.3 Objektově orientované programování........................ 27 1.3.1 Základní pojmy OOP....................................... 28 1.3.2 Některé další pojmy....................................... 30 Základní pojmy 2.1 Popis jazyků C a C++......................................... 31 2.2 Množina znaků............................................... 32 2.2.1 Univerzální jména znaků................................... 33 2.3 Identifikátor.................................................. 34 2.3.1 Oblast platnosti, oblast viditelnosti......................... 35 2.4 Klíčová slova................................................. 35 2.5 Lexikální konvence a zápis programu......................... 37 2.6 Průběh překladu............................................. 37 2.6.1 Průběh překladu podrobně................................ 38 2.6.2 Pozorovatelné chování programu.......................... 39 2.7 Definice a deklarace.......................................... 40 2.7.1 Deklarace.................................................. 40 2.7.2 Definice................................................... 40 2.7.3 Pravidlo jediné definice.................................... 41 2.8 L-hodnota a r-hodnota....................................... 42 2.8.1 L-hodnota, r-hodnota a další (C++0X)...................... 43 2.9 Zarovnání.................................................... 43 2.10 Běh programu................................................ 44 2.10.1 Inicializace globálních proměnných........................ 44 2.10.2 Ukončení programu....................................... 45 Obsah 5

3. 4. Základní datové typy 3.1 Celá čísla..................................................... 47 3.1.1 Celočíselné literály......................................... 49 3.1.2 Další celočíselné typy v C99 a v C++0x..................... 50 3.2 Znakové typy................................................. 51 3.2.1 Znakové literály............................................ 52 3.3 Logické hodnoty.............................................. 53 3.3.1 Typ bool (C++)............................................ 53 3.3.2 Typ _Bool (C99)............................................ 54 3.4 Operace s celými čísly......................................... 54 3.4.1 Přiřazování................................................. 54 3.4.2 Aritmetické operace....................................... 54 3.4.3 Relace..................................................... 56 3.4.4 Logické operace........................................... 56 3.4.5 Bitové operace............................................ 56 3.4.6 Další operace.............................................. 58 3.5 Reálná čísla.................................................. 58 3.5.1 Reálné typy v C99......................................... 59 3.5.2 Reálné literály.............................................. 59 3.5.3 Operace s reálnými čísly................................... 60 3.6 Komplexní čísla (jen C99)..................................... 61 3.6.1 Operace s komplexními čísly............................... 62 3.6.2 Přiřazování................................................. 62 3.6.3 Aritmetické operace....................................... 62 3.6.4 Logické operace........................................... 62 3.6.5 Další operace s komplexními čísly......................... 63 3.7 Typ void...................................................... 63 Výčtové typy, struktury a unie 4.1 Výčtové typy.................................................. 65 4.1.1 Deklarace výčtového typu................................. 65 4.1.2 Použití výčtového typu.................................... 68 4.1.3 Rozsah výčtového typu.................................... 68 4.1.4 Operace s výčtovými typy................................. 69 4.1.5 Přetěžování operátorů..................................... 70 4.2 Struktury..................................................... 70 4.2.1 Deklarace struktury........................................ 70 4.2.2 Složky struktur............................................. 72 4.2.3 Inicializace................................................. 73 6 Jazyky C a C++

4.2.4 Bitová pole................................................ 74 4.2.5 Otevřená pole............................................. 75 4.2.6 Literály typu struktura..................................... 75 4.2.7 Přetěžování operátorů..................................... 76 4.3 Unie.......................................................... 76 4.3.1 Deklarace unie............................................ 76 4.3.2 Složky unií................................................. 77 4.3.3 Inicializace unií............................................ 78 4.3.4 Literály typu unie.......................................... 78 4.3.5 Anonymní unie (jen C++)................................. 78 4.3.6 Přetěžování operátorů..................................... 79 5. 6. Ukazatele, pole a reference 5.1 Pole.......................................................... 81 5.1.1 Jednorozměrná pole....................................... 81 5.1.2 Inicializace................................................. 82 5.1.3 Použití polí................................................ 83 5.1.4 Vícerozměrná pole......................................... 85 5.1.5 Předávání pole jako parametru funkce..................... 86 5.1.6 Literály typu pole (C99).................................... 87 5.2 Ukazatele.................................................... 87 5.2.1 Inicializace ukazatelů...................................... 89 5.2.2 Dereferencování........................................... 90 5.2.3 Dynamické přidělování a navracení paměti................ 91 5.2.4 Uvolňování dynamicky alokované paměti.................. 94 5.2.5 Aritmetické operace s ukazateli............................ 95 5.2.6 Ukazatele na funkce....................................... 96 5.2.7 Ukazatele na statické prvky tříd............................ 97 5.2.8 Restringované ukazatele v C99............................ 97 5.3 Reference (jen v C++)........................................ 99 5.3.1 Reference na funkce..................................... 101 5.3.2 Konstantní reference................................... 101 5.3.3 Reference na r-hodnotu (C++0x)......................... 101 Proměnné a deklarace 6.1 Syntax deklarace........................................... 103 6.1.1 Mnemotechnické uspořádání deklarace................. 103 6.1.2 Popis deklarace.......................................... 103 6.1.3 Význam základních tvarů deklarátoru.................... 104 Obsah 7

6.1.4 Automatické odvození typu (C++0x)..................... 105 6.1.5 Specifikace decltype (C++0x)............................ 106 6.1.6 Označení typu........................................... 106 6.1.7 Deklarace nového jména typu........................... 106 6.2 Paměťové třídy............................................. 107 6.2.1 Specifikátory paměťových tříd........................... 107 6.2.2 Automatické proměnné (paměťová třída auto).......... 107 6.2.3 Registrové proměnné (paměťová třída register).......... 108 6.2.4 Statické proměnné (paměťová třída static)............... 108 6.2.5 Externí proměnné (paměťová třída extern)............... 109 6.2.6 Měnitelné složky konstant (paměťová třída mutable).... 109 6.2.7 Proměnné lokální v podprocesu (paměťová třída thread_local)............................................ 109 6.3 Jiné specifikátory........................................... 109 6.3.1 Cv-modifikátory......................................... 109 6.3.2 Volací konvence......................................... 112 6.3.3 Další modifikátory....................................... 112 6.4 Atributy (C++0x)........................................... 113 6.4.1 Specifikace zarovnání................................... 113 6.4.2 Další atributy............................................ 113 6.5 Doba života, oblast platnosti a viditelnost.................. 114 6.5.1 Oblast platnosti identifikátoru........................... 114 6.5.2 Viditelnost identifikátoru................................. 115 6.5.3 Doba života proměnné.................................. 116 6.6 Rozdělení identifikátorů.................................... 116 6.6.1 Jazyk C.................................................. 116 6.6.2 Jazyk C++............................................... 117 6.7 Deklarace asm.............................................. 118 6.8 Deklarace static_assert (C++0x)........................... 118 7. Jmenné prostory 7.1 Deklarace jmenného prostoru.............................. 119 7.2 Přejmenování prostoru jmen............................... 120 7.3 using....................................................... 121 7.3.1 Direktiva using........................................... 121 7.3.2 Deklarace using......................................... 123 7.4 Koenigovo vyhledávání..................................... 124 7.4.1 K čemu to je............................................ 125 7.4.2 Koenigovo vyhledávání a šablony........................ 126 8 Jazyky C a C++

8. 9. Operátory a výrazy 8.1 Výraz....................................................... 127 8.1.1 Konstantní výraz........................................ 127 8.2 Přehled operátorů.......................................... 129 8.2.1 Priorita a asociativita.................................... 131 8.2.2 Pořadí vyhodnocování operandů....................... 131 8.3 Konverze................................................... 131 8.3.1 Celočíselná a reálná rozšíření........................... 132 8.3.2 Obvyklé aritmetické konverze.......................... 135 8.3.3 Konverze číselných typů................................ 135 8.3.4 Konverze ukazatelů..................................... 136 8.3.5 Standardní konverze.................................... 137 8.4 Popis jednotlivých operátorů............................... 137 8.4.1 Operátory pro přístup k datům......................... 137 8.4.2 Aritmetické operátory.................................. 144 8.4.3 Inkrementace a dekrementace ++,--.................... 146 8.4.4 Relační operátory....................................... 147 8.4.5 Bitové operace......................................... 150 8.4.6 Logické operátory...................................... 153 8.4.7 Přiřazovací operátory................................... 156 8.4.8 Alokace a uvolňování paměti........................... 157 8.4.9 Přetypování............................................ 162 8.4.10 Dynamická identifikace typu typeid.................... 170 8.4.11 Operátor sizeof......................................... 172 8.4.12 Zjištění adresy &........................................ 173 8.4.13 Podmínkový operátor (podmíněný výraz)?:............. 174 8.4.14 Operátor čárka,........................................ 176 8.4.15 Operátor throw......................................... 177 8.4.16 Operátor decltype (C++0x)............................. 178 Příkazy 9.1 Jednoduché příkazy........................................ 179 9.1.1 Výrazový příkaz......................................... 179 9.1.2 Prázdný příkaz.......................................... 180 9.1.3 Deklarace jako příkaz.................................. 180 9.2 Složený příkaz (blok)....................................... 180 9.3 Větvení programu.......................................... 180 9.3.1 Podmíněný příkaz if.................................... 180 9.3.2 Příkaz switch........................................... 182 Obsah 9

9.4 Cykly....................................................... 185 9.4.1 Příkaz while............................................ 186 9.4.2 Příkaz for............................................... 187 9.4.3 Cyklus do-while........................................ 188 9.4.4 Příkaz cyklu pro procházení kontejneru (jen C++0x).... 189 9.5 Přenos řízení............................................... 190 9.5.1 Příkaz continue......................................... 190 9.5.2 Příkaz break............................................ 191 9.5.3 Příkaz return............................................ 191 9.5.4 Příkaz goto a návěští.................................... 192 9.5.5 Příkaz throw............................................ 193 9.5.6 Příkaz leave.......................................... 193 9.5.7 Ukončení programu pomocí funkce exit().............. 193 9.5.8 Dlouhý skok pomocí longjmp( )........................ 193 9.6 Příkaz asm................................................. 193 10. Funkce 10.1 Definice a deklarace funkce................................. 195 10.1.1 Definice funkce......................................... 195 10.1.2 Deklarace funkce....................................... 198 10.1.3 Parametry funkce....................................... 199 10.1.4 Lokální proměnné...................................... 200 10.1.5 Paměťová třída funkcí.................................. 200 10.1.6 Modifikátor inline....................................... 200 10.1.7 Zastaralý způsob deklarace............................. 201 10.1.8 Spolupráce C s C++.................................... 202 10.1.9 Konstantní funkce (C++0x)............................. 203 10.2 Výměna dat mezi funkcemi................................. 203 10.2.1 Vracená hodnota...................................... 204 10.2.2 Parametry.............................................. 206 10.2.3 Funkce s proměnným počtem parametrů.............. 211 10.2.4 Globální proměnné..................................... 213 10.2.5 Statické proměnné..................................... 213 10.3 Volací konvence............................................ 213 10.3.1 Volací konvence jazyka C............................... 214 10.3.2 Volací konvence jazyka Pascal.......................... 214 10.3.4 Standardní konvence................................... 214 10.3.5 Registrová konvence................................... 215 10.4 Funkce main().............................................. 215 10 Jazyky C a C++

10.4.1 Parametry funkce main()................................ 215 10.5 Rekurze a režie volání funkcí............................... 216 10.5.1 Rekurzivní volání funkce................................ 216 10.5.2 Režie volání funkce..................................... 217 10.6 Přetěžování funkcí.......................................... 217 10.6.1 Přetěžování obyčejných funkcí.......................... 218 10.6.2 Přetěžování metod (členských funkcí)................... 218 10.6.3 Která přetížená funkce se zavolá?....................... 219 10.6.4 Přetěžování, překrytí, zastínění.......................... 220 10.7 Lambda-výrazy (C++0x)................................... 220 10.7.1 Deklarace lambda-výrazu............................... 221 10.7.2 Záchyt.................................................. 222 10.8 Modulární programování a funkce.......................... 224 11. Třídy a objekty 11.1 Deklarace třídy............................................. 225 11.1.1 Specifikace přístupových práv.......................... 226 11.1.2 Třídy a OOP............................................ 227 11.2 Datové složky............................................... 229 11.2.1 Nestatické datové složky................................ 229 11.2.2 Statické datové složky.................................. 230 11.3 Členské funkce (metody)................................... 232 11.3.1 Nestatické členské funkce.............................. 232 11.3.2 Statické členské funkce................................. 234 11.3.3 Definice metody uvnitř třídy............................ 235 11.3.4 Definice vně definice třídy.............................. 235 11.4 Ukazatel this............................................... 236 11.5 Přístup ke složkám tříd..................................... 237 11.5.1 Přístup zevnitř třídy..................................... 237 11.5.2 Přístup z vnějšku třídy.................................. 238 11.5.3 Spřátelené funkce...................................... 238 11.6 Dědění..................................................... 240 11.6.1 Předkové............................................... 240 11.6.2 Přístupová práva pro zděděné složky................... 241 11.6.3 Přetěžování a zastínění................................. 242 11.6.4 Virtuální dědění........................................ 243 11.7 Polymorfizmus............................................. 245 11.7.1 Časná a pozdní vazba.................................. 245 Obsah 11

11.7.2 Virtuální metody (C++03)............................... 246 11.7.3 Virtuální destruktor..................................... 248 11.7.4 Abstraktní třídy, čistě virtuální metody.................. 248 11.8 Upřesnění v deklaraci třídy (C++0x)........................ 249 11.8.1 Třídy, od nichž nelze odvozovat potomky............... 250 11.8.2 Explicitní deklarace překrytí a zastínění................. 250 11.9 Zvláštní metody............................................ 251 11.9.1 Konstruktory........................................... 251 11.9.2 Kopírovací konstruktor.................................. 256 11.9.3 Dědění konstruktorů (C++0x)........................... 258 11.9.4 Konstruktor pro konstantní výrazy (C++0x)............. 259 11.9.5 Volání jiného konstruktoru téže třídy (C++0x)........... 259 11.9.6 Destruktory............................................. 260 11.9.7 Pořadí volání konstruktorů a destruktorů................ 260 11.9.8 Volání virtuálních metod z konstruktorů a destruktorů... 261 11.10 Vytváření instancí.......................................... 262 11.10.1 Konstantní a nestálé instance........................... 262 11.10.2 Pole instancí........................................... 262 11.11 Lokální třídy................................................ 263 11.12 Vnořené typy............................................... 263 11.12.1 Vnořené třídy........................................... 264 11.13 Ukazatele na instance...................................... 265 11.14 Struktury a unie............................................ 266 11.14.1 Struktury............................................... 266 11.14.2 Unie.................................................... 267 11.15 Třídní ukazatele............................................ 267 11.15.1 Ukazatel na datovou složku............................. 267 11.15.2 Ukazatel na metodu.................................... 269 11.15.3 Ukazatele na statické složky............................ 271 12. Přetěžování operátorů 12.1 Základní pravidla........................................... 273 12.1.1 Omezení............................................... 273 12.2 Operátory, které lze přetěžovat jako metody i jako volné funkce................................................ 274 12.2.1 Přetěžování unárních operátorů........................ 274 12.2.2 Přetěžování binárních operátorů........................ 276 12.3 Operátory, které lze přetěžovat jen jako metody............ 277 12 Jazyky C a C++

12.3.1 Přetěžování operátoru volání funkce.................... 277 12.3.2 Přetěžování přiřazovacího operátoru.................... 278 12.3.3 Přetěžování operátoru indexování...................... 280 12.3.4 Přetěžování operátoru ->.............................. 281 12.3.5 Operátor přetypování (konverzní funkce)............... 281 12.4 Operátory pro práci s pamětí............................... 282 12.4.1 Co můžeme změnit.................................... 282 12.4.2 Přetěžování operátoru new............................. 283 12.4.3 Přetěžování operátoru delete........................... 285 12.4.4 Operátory new a delete a výjimky...................... 286 12.5 Uživatelem definované literály (C++0x).................... 288 12.5.1 Parametry literálového operátoru....................... 288 12.5.2 Surové a hotové literály................................. 289 13. Výjimky 13.1 Proč výjimky?............................................... 291 13.1.1 Oč jde.................................................. 292 13.2 Klasické řešení v C: dlouhý skok............................. 292 13.2.1 Použití dlouhého skoku................................. 292 13.3 Výjimky v C++............................................. 294 13.3.1 Schéma použití výjimek................................ 294 13.3.2 Co se děje.............................................. 295 13.3.3 Částečné ošetření...................................... 297 13.3.4 Výjimky a funkce....................................... 297 13.3.5 Neošetřené a neočekávané výjimky.................... 299 13.3.6 Standardní třídy výjimek................................ 300 13.3.7 Výjimky a alokace paměti............................... 303 13.4 Strukturované výjimky v jazyce C........................... 303 13.4.1 Schéma použití SEH.................................... 304 13.4.2 Co se děje.............................................. 305 13.4.3 Obsluha a filtr.......................................... 305 13.4.4 Vznik strukturovaných výjimek.......................... 306 13.4.5 Filtr..................................................... 307 13.4.6 Nepokračovatelné výjimky.............................. 308 13.4.7 Koncovka bloku........................................ 308 13.4.8 Neošetřené výjimky.................................... 309 Obsah 13

14. 15. Šablony 14.1 Deklarace šablony.......................................... 313 14.1.1 Instance šablony....................................... 314 14.2 Parametry šablon.......................................... 314 14.2.1 Typové parametry...................................... 315 14.2.2 Hodnotové parametry.................................. 315 14.2.3 Šablonové parametry................................... 316 14.3 Šablony volných funkcí..................................... 316 14.3.1 Vytváření instancí....................................... 317 14.3.2 Explicitní (úplná) specializace........................... 318 14.3.3 Přetěžování šablon volných funkcí...................... 319 14.4 Šablony objektových typů.................................. 322 14.4.1 Šablony metod......................................... 323 14.4.2 Šablony statických datových složek..................... 324 14.4.3 Vnořené šablony....................................... 325 14.4.4 Vytváření instancí....................................... 327 14.4.5 Specializace............................................ 327 14.4.6 Přátelé................................................. 329 14.4.7 Dědění................................................. 333 14.5 Organizce programu........................................ 334 14.5.1 Exportní šablony (C++03).............................. 334 14.5.2 Externí šablony (C++0x)................................ 335 14.6 Šablony s proměnným počtem parametrů (C++0x)......... 335 14.6.1 Parametry variadické šablony........................... 335 14.6.2 Rozvoj balíku parametrů................................ 335 14.7 Alias........................................................ 339 14.8 Různá omezení............................................. 339 Dynamická identifikace typů 15.1 Určení typu za běhu........................................ 341 15.1.1 Operátor typeid........................................ 341 15.1.2 Třída type_info......................................... 342 15.1.3 Operátor dynamic_cast................................. 342 15.2 Příklady užití RTTI.......................................... 342 15.2.1 Rozhodování podle typu............................... 342 15.2.2 Ladění.................................................. 343 15.2.3 Příslušnost k hierarchii.................................. 343 14 Jazyky C a C++

16. Preprocesor 16.1 Úvod....................................................... 345 16.2 Direktivy preprocesoru..................................... 347 16.2.1 Prázdná direktiva....................................... 347 16.2.2 Vkládání souborů....................................... 347 16.2.3 Makra.................................................. 348 16.2.4 Zrušení definice makra................................. 352 16.2.5 Podmíněný překlad..................................... 352 16.2.6 Vyvolání chyby......................................... 355 16.2.7 Číslování řádků......................................... 355 16.2.8 Direktiva závislá na implementaci....................... 355 16.3 Předdefinovaná makra..................................... 357 Literatura......................................................... 359 Rejstřík........................................................... 361 Obsah 15

Předmluva Otevřeli jste knihu, která vám poskytne referenční příručku programovacích jazyků C a C++ podle platných standardů, a to včetně připravovaného nového standardu jazyka C++ označovaného zatím C++0x. Co v této knize najdete V úvodní kapitole najdete příklad jednoduchého programu, základní informace o vytváření zdrojového textu programu a o postupu při překladu. Tato kapitola se poněkud vymyká z rámce celé knihy, neboť spíše než referenční příručku připomíná první kapitolu učebnice. Jejím cílem je poskytnout rámec, který by mu usnadnil pochopení dalších kapitol i čtenářům, kteří s jazyky C a C++ nemají žádnou zkušenost, nebo ji mají jen velmi malou. V závěru první kapitoly najdete také několik slov o historii těchto jazyků, o jejich mezinárodních standardech, a také velice stručný výklad základních pojmů objektově orientovaného programování se zřetelem k C a C++. Ve druhé kapitole se seznámíte se způsobem popisu jazyků C a C++ a se základními stavebními prvky, jako je množina znaků, identifikátory, klíčová slova atd. Následující kapitoly popisují základní datové typy, uživatelem definované neobjektové typy, výrazy, příkazy, operátory atd. ostatně to najdete v obsahu. Každý významový celek začíná zpravidla popisem syntaxe, za nímž následuje stručné vysvětlení významu a podstatné informace shrnuté do bodů a doplněné příklady. Tento postup ale nemělo smysl dodržovat vždy. Převážnou většinu příkladů jsem odzkoušel na současných překladačích jazyků C a C++ na PC. V několika případech jsem převzal příklady přímo ze standardů [1] a [3]; zpravidla se jednalo o rysy jazyka, které běžné současné překladače ještě neimplementují nebo je neimplementují v souladu se standardy. (Může vám připadat podivné, že překladače jazyka C z roku 2010 neimplementují v plném rozsahu novinky standardu [3] tohoto jazyka z roku 1999, ale je to tak; pro tvůrce většiny překladačů je ovšem důležitější kompatibilita s jazykem C++ a ještě standard [1] jazyka C++ z roku 2003 byl založen na standardu [2] jazyka C z roku 1990. Většiny příkladů týkajících se C++0x jsem převzal z návrhu nového standardu [4]; některé z nich bylo možno vyzkoušet v současných překladačích, ovšem zdaleka ne všechny. Poznamenejme, že dokument [4], z něhož jsem čerpal, je označen jako konečný návrh standardu. Jak tato kniha vznikla V roce 1999 vydalo nakladatelství Grada Publishing knihu Programovací jazyky C a C++podle normy ANSI/ISO kompletní kapesní průvodce (D. Louis, P. Mejzlík, M. Virius), která shrnovala oba jazyky i jejich knihovny do jediného svazku. V době, kdy jsme ji psali, tedy v letech 1997 1998, ovšem nebylo ještě k dispozici konečné znění prvního standardu jazyka C++, vydané v září 1998, ani nový standard jazyka C, vydaný v r. 1999. Neobsahovala tedy řadu důležitých informací. Také příklady byly přizpůsobeny nejrozšířenějším překladačům té doby a ty se od standardu v mnoha ohledech odchylovaly. Ostatně ani struktura knihy nebyla právě šťastná, neboť byla přizpůsobena striktním požadavkům edice (10 kapitol, co nejvíce postupů apod.). Předmluva 17

* Proto jsem se v po dohodě s nakladatelstvím Grada Publishing rozhodl tuto knihu od základu přepracovat. Z původního díla jsem převzal některé příklady a části textu, avšak i ty jsem přizpůsobil novým standardům obou jazyků. Tato verze vyšla v nakladatelství Grada Publishing pod názvem Jazyky C a C++ Kompletní kapesní průvodce programátora (M. Virius, 2005). Na začátku roku 2011 mne nakladatelství Grada požádalo, abych tuto knihu připravil k novému vydání. Protože koncem roku 2011 má vyjít nový standard C++ s řadou zásadních novinek, rozhodl jsem se k dalšímu přepracování celé knihy, aby obsahovala oba jazyky podle standardů, jež budou platit v době, kdy vyjde. Výsledek držíte v ruce. Typografické a jiné konvence Domnívám se, že nemá smysl zdůrazňovat, že kurziva znamená zdůraznění a neproporcionální písmo že používám k zápisu ukázek zdrojového textu, identifikátorů, klíčových slov apod. a výstupu počítače. To pozná každý průměrně inteligentní čtenář na první pohled (a programátoři bývají více než průměrně inteligentní). Způsob a význam popisu syntaktických konstrukcí, který v této knize používám, je vysvětlen v kapitole 2.1 na str. 31. [1] V hranatých závorkách jsou uvedeny odkazy na seznam literatury (str. 359). C90 Pro jazyk C podle normy ISO 9899:1990 [2] používám zkratku C90. C99 Pro jazyk C podle normy ISO 9899:1999 [3], která nahradila standard [2], používám zkratku C99. C++03 Pro jazyk C++ podle standardu ISO 14882:2003 [1] používám zkratku C++03. C++0x Pro jazyk C++ podle připravovaného standardu ISO, jehož vydání se očekává koncem roku 2011, používám zkratku C++0x. Poděkování Chci poděkovat všem, kteří mi při přípravě této knihy pomohli svými radami a připomínkami. Přes veškerou péči, kterou jsem této knize věnoval, se v ní mohou vyskytnout chyby. Pokud na nějakou přijdete, dejte mi prosím vědět; na webové stránce http://tjn.fjfi. cvut.cz/~virius/errata.htm uveřejním opravu. Miroslav Virius miroslav.virius@fjfi.cvut.cz 18 Jazyky C a C++

1. Úvod Je zvykem, že knihy o programovacím jazyce C nebo C++ začínají příkladem, který vypíše nějaký vtipný text a skončí. Pak následuje stručné vysvětlení jeho významu, informace o způsobu překladu apod. Autor si tím vytvoří rámec, který mu umožní předvádět příklady na spustitelných programech. I když v referenční příručce nic takového není nezbytné, přidržíme se této tradice, abychom usnadnili její používání i čtenářům, kteří tyto jazyky znají jen povrchně a potřebují je rychle začít používat. 1.1 První program V tomto oddílu si ukážeme první programy v jazyce C++ a v C, seznámíme se s pravidly pro vytváření zdrojového textu, s postupem překladu atd. Protože některé z těchto věcí mohou do značné míry záviset na použitém překladači, uvedeme pouze základní informace; podrobnosti musíte hledat v dokumentaci ke svému překladači. Zdrojový text našeho prvního programu v C++ je jednoduchý: /* Soubor PrvniPlus.CPP První program v C++ */ #include <iostream> // 4 using namespace std; // 5 int main() { // 6 cout << "Hello, World << endl"; // 7 return 0; // 8 } // 9 Podobný program v jazyce C může vypadat takto: /* Soubor Prvni.c První program v jazyce C */ #include <stdio.h> int main() { printf("hello, World\n"); /* 6 */ return 0; } Úvod 19

Tento program uložíme do textového souboru. Pro programy v jazyce C++ se typicky používá přípona.cpp, pro programy v jazyce C přípona.c. Lze se ale setkat i s jinými např. v některých unixových systémech se pro programy v C++ používají přípony.c nebo.cc Podobně jako v jiných programovacích jazycích, i v C a v C++ platí, že tento soubor nesmí obsahovat formátování, tedy např. velikost a řez písma apod. Zpravidla jde o soubory v kódování ASCII (nebo v jiném jednobajtovém kódování, které váš počítač používá), dnešní překladače však už zpravidla akceptují zdrojové soubory v kódování Unicode. Jestliže tento program přeložíme a spustíme, vypíše Hello, World Než se ale pustíme do překladu a sestavování tohoto programu, vysvětlíme si (bez nároku na úplnost) význam jeho jednotlivých částí. 1.1.1 Co je co Pokud výslovně nezdůrazním něco jiného, týká se výklad jak C, tak C++. Veškeré pojmy z jazyků C a C++, které si zde naznačíme, budou znovu vysvětleny v referenční části této knihy. Začneme nepochybně nejnápadnější součástí zdrojového textu komentářem. Komentář První tři řádky v obou programech představují víceřádkový komentář. Ten začíná dvojicí znaků /* (zapsaných bezprostředně zas sebou) a končí dvojicí znaků */, opět zapsaných bezprostředně zas sebou. Překladač ignoruje tyto znaky a vše mezi nimi. Vedle toho máme v C++ a v C99 k dispozici jednořádkový komentář. Ten začíná dvojicí lomítek, //, a končí na konci řádku. Jednořádkové komentáře jsme v prvním výpisu použili k očíslování některých řádků. Struktura programu a funkce main() Programy v jazycích C a C++ jsou tvořeny posloupností deklarací. To zní možná podivně, ale v principu to znamená, že se skládají z deklarací funkcí, 1 typů a proměnných. Zjednodušeně řečeno, právě jedna z těchto funkcí musí mít jméno main a program začne prvním příkazem této funkce. Po skončení funkce main() 2 program skončí. Podívejme se na první z výše uvedených výpisů. Deklarace funkce main() začíná v prvním výpisu na 6. řádku. Nejprve je uvedena specifikace typu výsledku (zde je to typ int, tedy celé číslo se znaménkem), pak následuje identifikátor funkce a za ním prázdné závorky, které říkají, že tato funkce nemá žádné parametry. Tyto závorky jsou nezbytné. Pak následuje otevírací složená závorka {, jíž začíná tělo funkce. Toto tělo končí uzavírací složenou závorku } na 9. řádku. Tělo funkce tvoří příkazy uzavřené mezi těmito závorkami. 1 V C a v C++ se nerozlišuje mezi funkcí a procedurou; jakýkoli podprogram se nazývá funkce. 2 Jméno (identifikátor) této funkce je main. V textu knihy budeme k identifikátorům funkcí připisovat závorky, aby bylo na první pohled jasné, že se jedná o funkci. Bude-li to potřebné, uvedeme v závorkách i typy parametrů. 20 Jazyky C a C++

Řetězcová konstanta V 7. řádku souboru PrvniPlus.CPP najdeme zápis "Hello, World". To je řetězcová konstanta posloupnost znaků uzavřená mezi uvozovky. Výstup v C++ Výstup je jazycích C a C++ je realizován pomocí funkcí nebo objektů, které se nacházejí ve standardní knihovně. Tzv. standardní výstupní proud (typicky přesměrovatelný výstup na konzolu) je v C++ představován objektem cout. Vystupující hodnoty do tohoto proudu vkládáme pomocí operátoru <<. Zápisem cout << "Hello, World" << endl; do tohoto proudu vkládáme postupně dvě věci: zaprvé řetězcovou konstantu představující vypisovaný text a zadruhé tzv. manipulátor endl, který způsobí přechod na nový řádek. Výstup v C Podívejme se nyní na druhý výpis, tj. na soubor Prvni.c. Jazyk C používá pro vstupní a výstupní operace knihovní funkce. Jednou z nich je funkce prinft(), která vypíše zadaný znakový řetězec do standardního výstupu. Tuto funkci lze volat i s více parametry. Hlavičkové soubory Ani v C, ani v C++ nesmíme použít nic, co překladač nezná. To platí i pro součásti standardních knihoven překladač je nezná, dokud mu o nich neřekneme. Proto je třeba překladači předem oznámit, že budeme používat objekt cout, resp. funkci printf(), které jsou definovány ve standardní knihovně. Abychom však nemuseli jejich deklarace vypisovat do svých programů ručně, jsou připraveny v tzv. hlavičkových souborech. Tyto hlavičkové soubory vkládáme do svých programů tzv. direktivou preprocesoru #include, tedy např. zápisem #include <iostream> Tuto direktivu musíme zapsat na samostatný řádek. Jméno souboru uzavřeme mezi lomené závorky tvořené znaky menší než a větší než. Poznamenejme, že standardní hlavičkové soubory v jazyce C++ nemají žádnou příponu. Hlavičkový soubor <iostream> 3 obsahuje základní nástroje pro vstupní a výstupní operace. V jazyce C mají standardní hlavičkové soubory typicky příponu.h. Soubor <stdio.h> obsahuje nástroje jazyka C pro vstupní a výstupní operace. Poznamenejme, že standardní knihovnu jazyka C můžeme používat i v C++. To znamená, že uvedený program můžeme přeložit i překladačem C++. Překladače C++ mají vlastní verzi hlavičkových souborů z jazyka C. Jejich obsah je prakticky stejný jako v C90, jazyk C++ však umožňuje používat je dvojím způsobem: 3 Jméno tohoto souboru je iostream. Lomené závorky připojujeme, abychom zdůraznili, že jde o hlavičkový soubor. S touto praxí se běžně setkáváme nejen v odborné literatuře, ale i v textu standardu těchto jazyků. Úvod 21

Stejně jako v jazyce C. Můžeme tedy napsat #include <stdio.h> a pak můžeme používat funkci printf(). Můžeme pro hlavičkový soubor použít jméno, které vznikne z původního jména v jazyce C připojením znaku c před první písmeno názvu a vynecháním přípony.h (tedy například <cstdio> místo <stdio.h>). V takovém případě budou všechny identifikátory, deklarované v tomto souboru, ležet ve jmenném prostoru std, takže budeme muset psát např. std::printf() místo pouhého printf() nebo použít deklaraci nebo direktivu using (viz dále). Blok příkazů Tělo funkce (nejen funkce main()) představuje z hlediska syntaxe jazyků C a C++ blok. To je skupina příkazů ohraničená složenými závorkami { a }. Bloky příkazů obsahují příkazy, které patří k sobě, jako například příkazy tvořící tělo funkce (viz kapitola 10.1.1), tělo cyklu (viz kapitola 9.4) nebo větve příkazu if (viz kapitola 9.3.1). Z hlediska syntaxe se blok příkazů chová jako jeden příkaz. Příkazy, zápis programu Každý příkaz v programu (kromě bloku) musí být ukončen středníkem. To znamená, že středník je součástí příkazu. Funkce main() v obou výše uvedených příkladech obsahuje dva příkazy. Oba musí být ukončeny středníkem (i poslední příkaz před uzavírací závorkou }). Příkaz může být zapsán i na několik řádků a naopak, na jednom řádku může být několik příkazů. Poznamenejme, že direktiva #include se nepovažuje za příkaz. Nepíšeme za ni středník a musí být na samostatném řádku. Příkaz return Na 8. řádku funkce main()najdeme příkaz return 0; Tento příkaz určuje místo, kde provádění funkce končí, a určuje její návratovou hodnotu (co bude výsledkem volání funkce). V případě funkce main() to je zpravidla kód ukončení programu, hodnota, kterou lze využít v některých prostředích k testům, zda program skončil úspěšně nebo chybou (a jakou). Příkaz return lze použít na kterémkoli místě v těle funkce. Jmenné prostory (jen C++) Jmenné prostory (též prostory jmen) jsou jakási příjmení, které lze připojit k identifikátorům. Je to nástroj, který má pomoci vyhnout se konfliktům jmen v rozsáhlých projektech a při používání několika různých knihoven. Plné jméno funkce, typu, proměnné nebo šablony, deklarované ve jmenném prostoru, se skládá z identifikátoru, ke kterému je prostřednictvím operátoru :: připojeno jméno jmenného prostoru. Například všechny identifikátory ze standardní knihovny jazyka C++ leží ve jmenném prostoru std. To znamená, že plné jméno objektu představujícího standardní výstupní proud je std::cout, plné jméno manipulátoru pro přechod na nový řádek je std::endl atd. 22 Jazyky C a C++

Jestliže nehrozí konflikt jmen, můžeme překladači říci, že budeme jméno prostoru jmen vynechávat. K tomu slouží direktiva using, která má tvar using namespace jméno_jmenného_prostoru ; Pak můžeme psát jen cout, endl atd. 1.1.2 Překlad a sestavení Zdrojový program je třeba přeložit do strojového kódu a vytvořit spustitelný program. Přitom lze postupovat několika způsoby: Překladač lze spustit z příkazového řádku. Překladač lze spustit z integrovaného vývojového prostředí (IDE). Překladač lze spustit pomocí utility make nebo jiného podobného nástroje (Ant, nmake apod.). Zde se podrobněji zastavíme pouze u první možnosti. Překlad z příkazového řádku: Jeden zdrojový soubor Pro určitost vezmeme překladač g++, který je součástí vývojového nástroje MinGW32. Poznamenejme, že MinGW32 je zdarma a je šířen pod licencí GNU. Překlad našeho programu, který se skládá z jediného zdrojového souboru, obstará příkaz g++ -o Prvni.exe PrvniPlus.cpp Výsledkem bude spustitelný soubor Prvni.exe. Po spuštění příkazem Prvni vypíše Hello, World Přepínač -o Prvni.exe určuje jméno výsledného spustitelného souboru. U některých překladačů ho lze vynechat a překladač použije jméno překládaného souboru. (V případě g++ by však měl výsledný soubor jméno a.exe.) Určujeme jazyk zdrojového souboru Většina překladačů rozlišuje programovací jazyk podle přípony zdrojového souboru. Přípona.c typicky znamená jazyk C, přípona.cpp jazyk C++. Podrobnosti najdete v dokumentaci ke svému překladači. Překladač g++, který zde budeme převážně používat, se však chová jinak. Současná verze tohoto překladače zachází se všemi zdrojovými soubory implicitně jako s programem v jazyce C++03. Chceme-li, aby daný soubor překládal jako program v jazyce C90, musíme mu v příkazovém řádku zadat volbu x c. To znamená, že musíme napsat např. g++ x c -o Prvni.exe Prvni.c Chceme-li, aby tento překladač akceptoval konstrukce, které nejsou v C90, ale jsou v C99, musíme to explicitně povolit dalším přepínačem -std=c99 v příkazovém řádku. Chceme-li, aby tento překladač při překladu programu v C++ akceptoval vybrané konstrukce zavedené v C++0x, musíme v příkazovém řádku zadat volbu -std=c++0x. Úvod 23

Program složený z několika souborů Jestliže se náš program skládá z několika zdrojových souborů, můžeme je v příkazovém řádku vypsat všechny. Například skládá-li se ze souborů Prvni.cpp a Pomocny.cpp, napíšeme g++ -o Prvni.exe Prvni.cpp Pomocny.cpp Oddělený překlad Jazyky C a C++ používají model odděleného překladu. To znamená, že různé zdrojové soubory téhož programu lze překládat samostatně a pak je sestavit. Chceme-li přeložit pouze soubor Prvni.cpp, napíšeme g++ -c -o Prvni.obj Prvni.cpp Přepínač -c přikazuje překladači, že má zdrojový soubor přeložit, nikoli však sestavovat. Přepínač -o opět určuje jméno výstupního souboru. Tím vznikne tzv. relativní soubor (object file) Prvni.obj, který obsahuje překlad zdrojového souboru do strojového kódu. Neobsahuje však nic více, tzn., nejsou tam vyřešeny odkazy na funkce a proměnné definované v jiných souborech nebo v knihovně. Poznamenejme, že u většiny překladačů lze přepínač o vynechat, překladač mu automaticky dá jméno shodné se jménem zdrojového souboru a pod Windows také příponu.obj. Překladač g++ mu dá příponu.o. Relativní soubory je třeba sestavit ve výsledný spustitelný soubor. K tomu slouží specializovaný program, označovaný jako sestavovací program nebo linker. U mnoha dnešních vývojových nástrojů (včetně MinGW) je však linker součástí překladače. Chceme-li sestavit výsledný program z relativních souborů Prvni.obj a Pomocny.obj, napíšeme g++ -o Prvni.exe Prvni.obj Pomocny.ob Vývojová prostředí a projekty Integrovaná vývojová prostředí (IDE) obvykle spojují editor, překladač, ladicí nástroje, nápovědu a další pomocné programy, které usnadňují vytváření aplikací. Zpravidla pracují s tzv. projektem. Na projekt se můžeme dívat jako na seznam souborů, z nichž se má vytvořit výsledná aplikace. V IDE lze pomocí dialogových oken nastavovat volby pro překlad nejen celého projektu, ale někdy i jednotlivých souborů. Podrobnosti o tom, jak definovat projekt a jak ho přeložit, je třeba hledat v dokumentaci k danému vývojovému prostředí. Utilita MAKE Jiným nástrojem pro automatizaci překladu je utilita make. To je pomocný program volaný z příkazového řádku, který vyhledá soubor se jménem makefile obsahující návod pro vytvoření požadovaného spustitelného souboru. V nejjednodušší podobě se skládá z komentářů začínajících znakem # a končících na konci řádku, z popisu závislostí a z pravidel, podle kterých se mají požadované soubory vytvářet. Popis závislostí začíná vždy jménem souboru, za ním následuje dvojtečka a výčet souborů, na nichž daný soubor závisí. (To znamená, že když se změní některý z uvedených souborů, musí se znovu závislý soubor vytvořit. Například zápis 24 Jazyky C a C++

prvni.exe: prvni.obj pomocny.obj říká, že soubor prvni.exe závisí na souborech prvni.obj a pomocny.obj. Za tímto řádkem musí následovat pravidlo pro vytvoření souboru prvni.exe, tedy volání překladače: g++ -o prvni.exe prvni.obj pomocny.obj Podobně je třeba definovat i závislosti souborů prvni.obj a pomocny.obj a pravidla pro jejich vytvoření. Celý soubor makefile pro překlad programu složeného ze zdrojových souborů prvni.cpp a pomocny.cpp může vypadat takto: # Soubor makefile # Popis vytvoření souboru prvni.exe # ze souborů prvni.cpp a pomocny.cpp # pomocí překladače g++ (MinGW32) prvni.exe: prvni.obj pomocny.obj g++ -o prvni.exe prvni.obj pomocny.obj prvni.obj: prvni.cpp g++ -c -o prvni.obj prvni.cpp pomocny.obj: pomocny.cpp g++ -c -o pomocny.obj pomocny.cpp Řádek se závislostmi začíná zpravidla na počátku řádku, řádek s pravidlem je obvykle odsazen o 1 zarážku tabulátoru. Překlad spustíme z příkazového řádku příkazem make Utilita make vždy nejprve vyhledá soubor jménem makefile a pak podle informací v něm kontroluje, zda se změnil některý ze souborů, na nichž jiné soubory závisí. Pokud ano, vytvoří znovu závislý soubor. To znamená, že překládá jen ty zdrojové soubory, které se od posledního překladu změnily. Nehodí-li se nám jméno makefile, lze použít jakékoli jméno s příponou.mak např. prvni.mak. Utilitu make pak zavoláme příkazem make jméno_souboru, tedy např. make prvni.mak V souboru makefile lze definovat makra, implicitní pravidla apod. a tak ušetřit v případě rozsáhlých projektů mnoho psaní. To však přesahuje možnosti této knihy; podrobnosti lze najít např. na adrese [9]. 1.2 Programovací jazyky C a C++ I když jsou si jazyky C a C++ velmi blízké, je třeba zdůraznit, že C++ není pouhé rozšíření jazyka C, neboť při návrhu C++ byla sice kompatibilita s jazykem C brána v potaz, nikoli však za každou cenu. V jazyce C existují konstrukce, které nejsou v C++ dovoleny; vedle toho narazíme i na konstrukce, které jsou sice správné v obou jazycích, ale v každém z nich mohou mít jiný význam. Je jich ovšem velmi málo a zpravidla jde o konstrukce, které nepatří do dobrého programátorského stylu. V textu na ně samozřejmě upozorním. Jazyk C navrhl a implementoval na počátku sedmdesátých let 20. století Denis Ritchie a použil ho při implementací jedné z verzí operačního systému Unix. Brzy se ukázalo, že jde Úvod 25

o velice příjemný a přitom i mocný programovací jazyk, a začal být používán k nejrůznějším účelům. S tím ovšem procházel i řadou změn nejstarší verze tohoto jazyka např. místo operátorů +=, -= apod. používaly operátory =+, =- atd. V roce 1978 vydal D. Ritchie spolu s B. W. Kernighanem proslulou knihu The C Programming Language [6], která se stala na dlouhou dobu neoficiálním standardem jazyka C. V roce 1990 byl jazyk C poprvé standardizován na mezinárodní úrovni. Jedním z prvních kroků na cestě k jazyku C++ bylo tzv. C s třídami. V roce l985 vznikla verze, kterou již lze považovat za řádný objektově orientovaný programovací jazyk. Známe ji pod názvem C++. Jazyk C++ od té doby dozrál a je stejně úspěšný jako jazyk C. Jedním z důvodů úspěchu je jistě téměř úplná kompatibilita C++ s C, která programátorům pracujícím v Céčku usnadnila přechod k objektově orientovanému programování a zaručila použití již existujících kódů napsaných v jazyce C. 1.2.1 Standardy Prvním, neoficiálním standardem jazyka C se stalo první vydání už zmíněné knihy B. W. Kernighana a D. Ritchieho The C Programming Language [6]. 4 Zde popsaná verze jazyka bývá označována jako jazyk C podle Kernighana a Ritchieho, případně zkratkou K&R. Oficiálně byl jazyk C poprvé standardizován na národní úrovni v USA v r. 1989. Tento dokument ANSI měl číslo X3J11/90-013. O rok později, v r. 1990, byl přijat mezinárodní standard ISO/IEC 9899:1990 [2]. V této knize pro něj budu používat zkratku C90. Jazyk podle tohoto standardu je dnes běžně používán, implementují ho prakticky všechny běžně dostupné překladače. Poznamenejme, že zároveň s tím byl v USA stažen standard ANSI a byl nahrazen standardem ISO. Na tom nic nemění skutečnost, že mnozí výrobci překladačů se stále odvolávají na standard ANSI to, co dodávají, je (nebo by měl být) překladač vyhovující mezinárodnímu standardu ISO. V roce 1995 byl přijat technický dodatek k tomuto standardu, který především rozšířil jazyk C o nástroje pro práci s tzv. širokými (tj. dvoubajtovými) znaky. V roce 1999 byla přijata druhá verze standardu jazyka C, označená ISO/IEC 9899:1999 [3], kterou budu označovat zkratkou C99. Přinesla řadu významných novinek především do jazyka zahrnula nejběžnější rozšíření a odstranila některé potenciálně nebezpečné rysy. Jazyk C++ byl od svého vytvoření v první polovině osmdesátých let spravován B. Stroustrupem pod záštitou firmy AT&T. Program v C++ byl původně překládán nejprve do jazyka C a teprve z něj překladačem jazyka C do strojového kódu. Proto se první verze tohoto jazyka označovaly Cfront. Do počátku devadesátých let bylo uvolněno několik verzí, z nichž za nejvýznamnější bývají pokládány verze Cfront 1.0 (objektové rozšíření jazyka C), Cfront 1.2, která přinesla mj. přetěžování operátorů, dále verze Cfront 2, jež přinesla vícenásobné dědění; verze Cfront 2.1 připojila šablony. V roce 1991 vyšla kniha The Annotated C++Reference Manual [8], označovaná často zkratkou ARM, která se stala základem návrhu standardu jazyka. Popisovala vedle šablon výjimky, jmenné prostory a dynamickou identifikaci typů. V roce 1998 byl přijat mezinárodní standard jazyka C++ ISO/IEC 14882:1998. Tento standard doplnil, upřesnil a v některých detailech i změnil jazyk popisovaný v ARM a přidal standardní 4 Poznamenejme, že druhé vydání této knihy z roku 1988 popisuje tehdy připravovaný standard ANSI. 26 Jazyky C a C++