K1455-1.qxd
6.6.2007
10:44
StrÆnka 3
Stručný obsah První týden den den den den den den den
1 2 3 4 5 6 7
Začínáme Anatomie programu C++ Proměnné a konstanty Výrazy a příkazy Funkce Objektově orientované programování Více o toku programu
Druhý týden den 8 den 9 den 10 den 11 den 12 den 13 den 14
Ukazatele Odkazy Pokročilé funkce Objektově orientovaná analýza a návrh Dědičnost Pole a řetězce Mnohotvarost
Třetí týden den den den den den den den
15 16 17 18 19 20 21
příloha A příloha B příloha C příloha D příloha E
Rejstřík
25 27 43 57 79 107 141 173
211 213 241 271 307 341 371 405
451
Speciální třídy a funkce Pokročilá dědičnost Proudy Obory názvů Šablony Výjimky a zpracování chyb Co dál?
453 481 531 569 587 635 667
Binární a hexadecimální aritmetika Klíčová slova C++ Přednost operátorů Odpovědi Seznámení s propojenými seznamy
715 725 727 729 777
787
K1455-1.qxd
6.6.2007
10:44
StrÆnka 4
K1455-1.qxd
6.6.2007
10:44
StrÆnka 5
Obsah O autorovi Věnování Poděkování Napište nám, co si myslíte
Úvod
23
Komu je tato kniha určena Konvence
První týden Poznámka pro programátory v jazyce C Další postup
den 1
21 21 21 22
Začínáme
Úvod Stručná historie jazyka C++ Řešení problémů Procedurální, strukturované a objektově orientované programování Objektově orientované programování (OOP) C++ a objektově orientované programování
Vývoj jazyka C++ Není lepší naučit se nejdříve C? C++, Java a C# Standard ANSI Příprava na psaní programu Vývojové prostředí Vytvoření programu Vytvoření objektového souboru kompilátorem Vytvoření spustitelného programu linkerem
Vývojový cyklus NAZDAR.cpp – první program v C++ Úvod do práce s kompilátorem Vytvoření projektu Nazdar lidi
Chyby při kompilaci Souhrn Otázky a odpovědi Úkoly pro vás Test Cvičení
23 23
25 25 25
27 27 27 28 29 30 30
32 32 32 32 33 34 34 35 35
35 35 38 38
39 40 40 41 41 41
K1455-1.qxd
6.6.2007
10:44
StrÆnka 6
6
Naučte se C++ za 21 dní
den 2
Anatomie programu C++
Jednoduchý program Krátký pohled na objekt cout Používání standardního oboru názvů Komentáře Typy komentářů Používání komentářů A na co si dát u komentářů pozor
Funkce Používání funkcí Metody a funkce
Poznámky pro českého čtenáře
43 43 46 47 49 50 50 51
51 52 54
54
Desetinná tečka Diakritika
54 55
Souhrn Otázky a odpovědi Úkoly pro vás
55 55 56
Test Cvičení
den 3
Proměnné a konstanty
Co je to proměnná? Reprezentace dat v paměti Vymezení paměti Velikost celých čísel Celá čísla se znaménkem (signed) a bez znaménka (unsigned) Základní typy proměnných
Definice proměnné
56 56
57 57 58 58 59 60 61
62
Rozlišování velkých a malých písmen Názvy proměnných Klíčová slova
63 63 63
Vytvoření více proměnných najednou Přiřazení hodnoty do proměnné Příkaz typedef Kdy používat short a kdy long
64 65 66 67
Přetečení celočíselného typu bez znaménka (unsigned) Přetečení celočíselného typu se znaménkem (signed)
Znaky Znaky a čísla Speciální znaky
Konstanty Literální konstanty Symbolická konstanta Definice konstanty s pomocí #define Definice konstanty s pomocí const
Výčtové konstanty
68 68
70 70 71
72 72 72 73 73
73
K1455-1.qxd
6.6.2007
10:44
StrÆnka 7
7
Obsah
Souhrn Otázky a odpovědi Úkoly pro vás Test Cvičení
den 4
Výrazy a příkazy
Příkazy Prázdné znaky Bloky a složené příkazy
Výrazy Operátory Operátor přiřazení Matematické operátory Potíže s odečítáním Celočíselné dělení a dělení se zbytkem
Kombinace operátoru přiřazení s matematickými operátory Inkrementace a dekrementace
76 76 77 77 78
79 79 80 80
81 82 82 82 83 84
84 85
Prefix a postfix
85
Priorita operátorů Vnořené závorky Povaha pravdivosti
87 88 88
Relační operátory
Příkaz if Styly odsazování Klauzule else Pokročilé příkazy if
Používání závorek ve vnořených příkazech if Logické operátory Logické AND (a zároveň) Logické OR (nebo) Logické NOT (ne)
Zkrácené vyhodnocování Priorita relačních a logických operátorů Více o pravdivosti a nepravdivosti Podmínkový operátor Souhrn Otázky a odpovědi Úkoly pro vás Test Cvičení
den 5
Funkce
Co je to funkce? Vrácené hodnoty, parametry a argumenty Deklarace a definice funkce
89
90 92 93 94
96 99 99 99 99
100 100 101 101 103 103 104 104 104
107 107 108 109
K1455-1.qxd
6.6.2007
10:44
StrÆnka 8
8
Naučte se C++ za 21 dní
Deklarace funkce Prototypy funkcí Definice funkce
Provádění funkcí Obor platnosti proměnných Lokální proměnné
Lokální proměnné v blocích Parametry jako lokální proměnné Globální proměnné Globální proměnné: na co si dávat pozor
Příkazy ve funkcích Více o argumentech funkcí Více o návratových hodnotách Výchozí parametry Přetížení funkcí Zvláštnosti týkající se funkcí Funkce řádkového typu Rekurze
Jak fungují funkce – nahlédnutí pod pokličku Úrovně abstrakce Rozdělení paměti RAM Zásobník a funkce
Souhrn Otázky a odpovědi Úkoly pro vás Test Cvičení
den 6
Objektově orientované programování
Je C++ objektově orientovaný jazyk? Tvorba nových typů Nevýhody tvorby typů pomocí struct
Třídy a členy Deklarace třídy Konvence týkající se názvů Definice objektu Třídy versus objekty
Přístup ke členům třídy Přiřazení hodnot objektům Používání členů nedeklarovaných třídou
Soukromé versus veřejné Členská data by měla být soukromá
Implementace metod třídy Konstruktory a destruktory Výchozí konstruktory a destruktory Používání výchozího konstruktoru
109 110 111
112 112 113
114 116 117 118
119 119 120 122 124 127 127 129
133 133 133 136
136 137 137 138 138
141 141 142 143
143 144 144 145 145
145 146 146
146 148
151 154 154 154
K1455-1.qxd
6.6.2007
10:44
StrÆnka 9
9
Obsah
Konstantní členské funkce Rozhraní versus implementace Umístění deklarace třídy a definice metod Implementace řádkových metod Třídy s jinými třídami jako členskými daty Struktury Souhrn Otázky a odpovědi Úkoly pro vás Test Cvičení
den 7
Více o toku programu
Smyčky První smyčky s příkazem goto Proč se vyhýbat goto
Smyčka while Složitější příkazy while Příkazy continue a break Smyčka while (true)
Smyčka do…while Příkaz do…while
Smyčka for Pokročilá smyčka for Vícenásobné inicializace a zvyšování hodnoty Prázdné příkazy ve smyčce for Prázdné smyčky for Vnořené smyčky Stanovení oboru platnosti ve smyčce for
Shrnutí smyček Příkaz switch Použití příkazu switch pro nabídku
Souhrn Otázky a odpovědi Úkoly pro vás
157 158 161 162 164 168 168 169 170 170 171
173 173 174 174
175 176 178 180
181 182
184 186 186 187 189 189 191
191 194 196
199 199 200
Test Cvičení
200 200
Opakování
203
Přehled týdne
203
K1455-1.qxd
6.6.2007
10:44
StrÆnka 10
10
Naučte se C++ za 21 dní
Druhý týden
211
Kam směřujete
211
den 8
Ukazatele
Co je to ukazatel? Něco málo o paměti Používání operátoru adresy (&) Uložení adresy do ukazatele Názvy ukazatelů Operátor nepřímého přístupu Ukazatele, adresy a proměnné Manipulace s daty prostřednictvím ukazatelů Prověření adresy
Proč vůbec používat ukazatele Zásobník a halda Klíčové slovo new Klíčové slovo delete
Úniky paměti Vytvoření objektu ve volném úložišti Vymazání objektu Přístup k datovým členům Členská data ve volném úložišti Ukazatel this Zbloudilé, divoké neboli vlající ukazatele Ukazatele const Ukazatele const a členské funkce const Ukazatele const this
Souhrn Otázky a odpovědi Úkoly pro vás Test Cvičení
den 9
Odkazy
Co je to odkaz? Operátor adresy & aplikovaný na odkazy Přiřazení jiné hodnoty odkazu
Na co se lze odkazovat Nulové ukazatele a nulové odkazy Předávání argumentů funkci odkazem Implementace funkce zamena() s pomocí ukazatelů Implementace funkce zamena() s pomocí odkazů
Porozumění hlavičkám funkcí a prototypům Vracení více hodnot Vracení hodnot odkazem
213 214 214 214 215 216 217 218 219 220
222 223 224 224
226 227 227 228 230 231 233 236 236 238
238 239 239 239 239
241 241 243 244
245 247 247 249 250
252 252 254
K1455-1.qxd
6.6.2007
10:44
StrÆnka 11
11
Obsah
Předávání odkazem kvůli výkonu Předání ukazatele na konstantní objekt Odkazy jako alternativa
Kdy používat odkazy a kdy ukazatele Míchání odkazů a ukazatelů Vrácení odkazu na objekt mimo obor platnosti Vracení odkazu na objekt ve volném úložišti Komu patří ukazatel? Souhrn Otázky a odpovědi Úkoly pro vás Test Cvičení
den 10 Pokročilé funkce Přetížené členské funkce Používání výchozích hodnot Volba mezi výchozími hodnotami a přetíženými funkcemi Výchozí konstruktor Přetížení konstruktorů Inicializace objektů Konstruktor pro kopírování Přetížení operátorů Definice funkce pro inkrementaci Přetížení prefixového operátoru Vracení typů v přetížených funkcích operátorů Vracení bezejmenného dočasného objektu Řešení s použitím ukazatele this Přetížení postfixového operátoru Rozdíl mezi prefixovým a postfixovým operátorem Přetížení binárního operátoru Přetížení operátoru + Problematika související s přetíženými operátory Omezení kladená na přetížení operátorů Co přetížit? Operátor přiřazení
Konverze datových typů Operátory konverze
Souhrn Otázky a odpovědi Úkoly pro vás Test Cvičení
255 258 260
262 263 264 266 268 268 269 269 269 269
271 271 274 276 276 276 278 279 283 284 285 286 287 289 291 291 293 294 296 296 296 297
299 302
303 304 304 304 305
K1455-1.qxd
6.6.2007
10:44
StrÆnka 12
12
Naučte se C++ za 21 dní
den 11 Objektově orientovaná analýza a návrh Vytváření modelů Softwarový návrh: Modelovací jazyk Softwarový návrh: Vlastní proces Vodopádový a iterační vývoj Proces iteračního vývoje
Krok 1: Fáze koncepce – začínáme vizí Krok 2: Fáze analýzy – zjistíme požadavky Případy použití Analýza aplikace Analýza systému Dokumenty plánování Vizualizace Výtvory
Krok 3: Fáze návrhu Co jsou to třídy? Transformace Statický model Dynamický model
Kroky 4 až 6: Implementace, testování a zavádění Iterace
Souhrn Otázky a odpovědi Úkoly pro vás Test Cvičení
307 307 308 309 310 310
312 312 312 321 322 322 323 323
323 324 325 326 334
337 337
337 338 339 339 339
den 12 Dědičnost
341
Co je to dědičnost?
341
Dědičnost a odvození Říše zvířat Syntaxe odvození
Soukromý versus chráněný Konstruktory a destruktory Předávání argumentů bázovým konstruktorům
Překrývání funkcí Skrytí metody bázové třídy Volání bázové metody
Virtuální metody Jak virtuální funkce fungují Pokus o přístup k metodám z bázové třídy Omezování Virtuální destruktory Virtuální kopírovací konstruktory Náklady na virtuální metody
Souhrn
342 343 343
345 347 349
353 355 356
358 362 363 363 365 366 368
369
K1455-1.qxd
6.6.2007
10:44
StrÆnka 13
13
Obsah
Otázky a odpovědi Úkoly pro vás Test Cvičení
den 13 Pole a řetězce Co je to pole? Prvky pole Zápis za konec pole Chyba sloupků u plotu Inicializování polí Deklarování polí Pole objektů Vícerozměrná pole Inicializování vícerozměrných polí Pole ukazatelů Aritmetika ukazatelů – pro pokročilé Deklarování polí na volném úložišti Ukazatel na pole versus pole ukazatelů Ukazatele a názvy polí Odstraňování polí na volném úložišti Změna velikosti pole za běhu
Pole znaků a řetězce Metody strcpy() a strncpy() Třídy řetězců Propojené seznamy a další struktury Třídy polí Souhrn Otázky a odpovědi Úkoly pro vás Test Cvičení
den 14 Mnohotvarost Problémy s jednoduchou dědičností Infiltrování směrem vzhůru Převádění směrem dolů Přidání do dvou seznamů
Vícenásobná dědičnost Části vícenásobně dědicího objektu Konstruktory ve vícenásobně dědicích objektech Vyřešení nejednoznačnosti Dědění ze sdílené bázové třídy Virtuální dědičnost Problémy s vícenásobnou dědičností
369 370 370 370
371 371 372 373 376 376 377 378 379 380 382 383 386 387 387 388 389
391 393 395 401 402 402 403 403 403 404
405 405 408 408 411
411 414 414 417 417 421 425
K1455-1.qxd
6.6.2007
10:44
StrÆnka 14
14
Naučte se C++ za 21 dní
Třídy smíšené a schopností
Abstraktní datové typy Čistě virtuální funkce Implementování čistě virtuálních funkcí Složité hierarchie abstrakce Které třídy jsou abstraktní?
Souhrn Otázky a odpovědi Úkoly pro vás
425
426 429 430 433 437
437 438 439
Test Cvičení
439 439
Opakování
441
Třetí týden Kam směřujete
den 15 Speciální třídy a funkce Sdílení dat mezi objekty stejného typu: Statická členská data Statické členské funkce Ukazatele na funkce Proč používat ukazatele na funkce? Pole ukazatelů na funkce Předání ukazatelů na funkce jiným funkcím Použití typedef ve spojení s ukazateli na funkce
Ukazatele na členské funkce Pole ukazatelů na členské funkce
Souhrn Otázky a odpovědi Úkoly pro vás Test Cvičení
den 16 Pokročilá dědičnost Obsažení Přístup ke členům v obsažené třídě Řízení přístupu k obsaženým členům Náklady na obsažení Kopírování hodnotou
Implementace z hlediska dědičnosti/ obsažení versus delegování Delegování
Soukromá dědičnost Přátelské třídy Přátelské funkce Přátelské funkce a přetěžování operátorů
451 451
453 453 458 460 464 467 469 471
473 476
477 478 478 479 479
481 481 488 488 488 491
494 495
503 511 519 520
K1455-1.qxd
6.6.2007
10:44
StrÆnka 15
15
Obsah
Přetížení operátoru vložení Souhrn Otázky a odpovědi Úkoly pro vás Test Cvičení
524 528 528 529 529 529
den 17 Proudy
531
Přehled proudů
531
Zapouzdření a tok dat Mezipamě
Proudy a buffery Standardní objekty I/O Přesměrování Vstup pomocí cin
532 532
534 534 535 535
Řetězce Problémy s řetězci Návratová hodnota cin
537 537 540
Další členské funkce cin
540
Vstup jediného znaku Přebírání řetězců ze standardního vstupu Používání cin.ignore() Pohled na vracené znaky: Funkce peek() a putback()
Výstup pomocí cout Vyprázdnění výstupu
Související funkce Zápis znaků pomocí put() Delší zápis pomocí write()
Manipulátory, příznaky a formátovací instrukce Používání cout.width() Zadání vyplňovacího znaku Správa stavu výstupu: Nastavení příznaků
Proudy versus funkce printf() Vstup ze souboru a výstup do souboru Objekt ofstream Podmínečné stavy Otevírání souborů pro vstup a výstup Změna výchozího chování objektu ofstream při otevírání
Binární versus textové soubory Zpracování příkazového řádku Souhrn Otázky a odpovědi Úkoly pro vás Test Cvičení
540 543 545 546
547 547
548 548 548
549 550 550 551
553 556 556 557 557 558
561 563 566 566 567 567 567
K1455-1.qxd
6.6.2007
10:44
StrÆnka 16
16
Naučte se C++ za 21 dní
den 18 Obory názvů
569
Začínáme Funkce a třídy se určují názvy
569 570
Viditelnost proměnných Propojení Statické globální proměnné
571 572 573
Vytvoření oboru názvů Deklarování a definování typů Definování funkcí mimo obor názvů Přidávání nových členů Vkládání oborů názvů do sebe
Použití oboru názvů Použití klíčového slova using Direktiva using Deklarace using
Alias oboru názvů Nepojmenovaný obor názvů Standardní obor názvů std Souhrn Otázky a odpovědi Úkoly pro vás Test Cvičení
573 574 574 575 575
576 577 578 579
580 581 582 583 584 584 584 585
den 19 Šablony Co jsou to šablony? Definice šablony Použití názvu Implementování šablony
Funkce šablony Šablony a přátelé Přátelské třídy a funkce nepatřící do šablony Obecné přátelské třídy a funkce šablony
587 587 589 591 592
595 596 596 600
Použití položek šablon
603
Specializované funkce Statické členy a šablony
607 612
Standardní knihovna šablon Kontejnery Sekvenční kontejnery Kontejner Kontejner Kontejner Kontejner Kontejner
vector list stack deque queue
Asociativní kontejnery Kontejner map
616 616 617 617 623 624 625 625
625 625
K1455-1.qxd
6.6.2007
10:44
StrÆnka 17
17
Obsah
Další asociativní kontejnery
Třídy algoritmů Neměnící sekvenční operace Měnící sekvenční algoritmy Řazení a související operace
Souhrn Otázky a odpovědi Úkoly pro vás Test Cvičení
den 20 Výjimky a zpracování chyb Chyby, chyby, chyby Výjimečné podmínky
Výjimky Součásti zpracování výjimek Jak vyvolávat vlastní výjimky Vytvoření třídy výjimky
Používání bloků try a bloků catch Zachycení výjimek Zpracování více výjimek Hierarchie výjimek
Data ve výjimkách a pojmenovávání objektů výjimek Výjimky a šablony Výjimky bez chyb Pár slov o zastarávání kódu Chyby a ladění Body zastavení Body sledování Prověření paměti Assembler
Souhrn Otázky a odpovědi Úkoly pro vás Test Test
den 21 Co dál? Preprocesor a kompilátor Používání příkazu #define Používání příkazu #define pro konstanty Používání příkazu #define při testování Příkaz preprocesoru #else
Vkládání souborů a dohled nad vkládáním Funkce makra Proč všechny ty závorky?
629
629 630 631 631
632 632 633 633 633
635 635 636
638 638 641 642
646 646 646 649
652 658 661 662 662 663 663 663 663
663 664 665 665 665
667 667 668 668 668 669
671 672 672
K1455-1.qxd
6.6.2007
10:44
StrÆnka 18
18
Naučte se C++ za 21 dní
Manipulace s řetězci Zřetězení Spojení
Předem definovaná makra Makro assert() Ladění s pomocí makra assert() Makra assert() versus výjimky Vedlejší účinky Invarianty třídy Tisk prozatímních hodnot Makra versus funkce a šablony
Řádkové funkce Hrátky s bity Operátor AND Operátor OR Operátor navzájem neslučitelného OR Operátor komplementu Nastavení bitů Nulování bitů Přepínání bitů Bitová pole
Programovací styl Odsazování Složené závorky Dlouhé řádky Příkazy switch Text programu Názvy identifikátorů Zápis a velká písmena názvů Komentáře Přístup Definice tříd Vkládané soubory (include) assert() const
Další kroky Kam se obrátit o radu a o pomoc Souvislosti s C++: Spravovaná rozšíření C++, C# a Microsoft .NET Zůstaňte ve spojení
Souhrn Otázky a odpovědi Úkoly pro vás
674 674 674
675 675 677 677 678 678 683 684
685 686 687 687 687 687 687 688 688 688
691 692 692 692 692 693 693 694 694 695 695 696 696 696
696 696 697 697
698 698 699
Test Cvičení
699 700
Opakování
701
K1455-1.qxd
6.6.2007
10:44
StrÆnka 19
19
Obsah
příloha A Binární a hexadecimální aritmetika Jiný než desítkový základ Různé základy
715 716 717
Binární základ Proč právě základ 2? Bity, bajty a půlbajty Co je to KB? Binární čísla
718 719 719 719 719
Hexadecimální čísla
720
příloha B Klíčová slova C++
725
příloha C Přednost operátorů
727
příloha D Odpovědi
729
Den 1. Den 2. Den 3. Den 4. Den 5. Den 6. Den 7. Den 8. Den 9. Den 10. Den 11. Den 12. Den 13. Den 14. Den 15. Den 16. Den 17. Den 18. Den 19. Den 20. Den 21.
příloha E Seznámení s propojenými seznamy Součásti komponent
Rejstřík Instalace software a příkladů z doprovodného CD
729 730 732 733 734 736 738 740 741 743 747 750 751 752 754 760 763 765 766 770 775
777 778
787 796