C++
Obsah boxu
Šablona:Infobox - programovací jazyk C++ (vyslovováno anglicky see plus plus [ˌsiːˌplʌsˈplʌs]) je vysokoúrovňový, kompilovaný, staticky typovaný, multiparadigmatický a univerzální programovací jazyk. Byl vyvinut dánským informatikem Bjarnem Stroustrupem v Bellových laboratořích v roce 1983 jako rozšíření jazyka C.
Jazyk byl navržen s důrazem na výkon, efektivitu a flexibilitu. Kombinuje vlastnosti nízkoúrovňových jazyků (přímá práce s pamětí) a vysokoúrovňových jazyků (abstrakce, podpora objektově orientovaného, generického a funkcionálního programování). Díky své rychlosti a schopnosti pracovat blízko hardwaru je C++ dominantním jazykem v oblastech, jako je vývoj počítačových her, operačních systémů, finančních systémů s vysokou frekvencí obchodování (HFT), vestavěných systémů a dalších aplikací náročných na výkon.
Vývoj jazyka je řízen mezinárodním standardizačním výborem ISO, který pravidelně vydává nové verze standardu (např. C++98, C++11, C++17, C++20, C++23), jež jazyk postupně modernizují a rozšiřují o nové funkce.
📜 Historie
Vývoj C++ začal v roce 1979 v Bellových laboratořích AT&T, kdy Bjarne Stroustrup začal pracovat na projektu "C with Classes" (C s třídami). Stroustrupovým cílem bylo zkombinovat eleganci a efektivitu jazyka C s koncepty objektově orientovaného programování, které poznal u jazyka Simula. Chtěl vytvořit jazyk, který by byl vhodný pro systémové programování, ale zároveň by poskytoval vyšší úroveň abstrakce pro zvládání velkých a složitých softwarových projektů.
🏛️ Počátky a první verze
- **1979:** Bjarne Stroustrup začíná práci na "C with Classes". První verze přidala do jazyka C klíčové OOP koncepty, jako jsou třídy, jednoduchá dědičnost, zapouzdření a inline funkce.
- **1983:** Jazyk je přejmenován na C++. Název, navržený Rickem Mascittim, odkazuje na inkrementační operátor `++` z jazyka C, což symbolizuje "o krok více než C". Do jazyka jsou přidány virtuální funkce, přetěžování operátorů a funkcí, reference a další vylepšení.
- **1985:** Byla vydána první komerční verze C++ spolu s knihou Bjarneho Stroustrupa The C++ Programming Language, která sloužila jako neoficiální standard jazyka po mnoho let.
- **1989:** Byla vydána verze C++ 2.0, která přinesla významná rozšíření, jako je vícenásobná dědičnost, abstraktní třídy a chráněné (protected) členy.
🌐 Standardizace
S rostoucí popularitou jazyka a vznikem různých implementací kompilátorů se stala nutností formální standardizace.
- **1998 (C++98):** Po několika letech práce vydal společný výbor ISO a IEC první mezinárodní standard pro C++, formálně známý jako ISO/IEC 14882:1998. Tento standard kodifikoval existující praxi a přidal klíčovou součást jazyka: Standard Template Library (STL).
- **2003 (C++03):** Jednalo se o menší, technickou revizi standardu C++98, která opravovala chyby a nejasnosti, ale nepřinášela nové jazykové vlastnosti.
- **2011 (C++11):** První velká revize standardu, která jazyk dramaticky modernizovala. Přinesla desítky nových funkcí, jako jsou lambda výrazy, klíčové slovo `auto` pro odvozování typů, sémantika přesunu (move semantics), chytré ukazatele (`std::unique_ptr`, `std::shared_ptr`), podporu pro vícevláknové programování a mnoho dalších vylepšení knihovny.
- **2014 (C++14):** Menší aktualizace C++11, která přinesla opravy a několik vylepšení, jako jsou generické lambda výrazy a vylepšené odvozování návratového typu funkcí.
- **2017 (C++17):** Další významná revize, která přidala například strukturované vazby (structured bindings), `if` s inicializátorem, paralelní verze algoritmů STL a souborový systém (`std::filesystem`).
- **2020 (C++20):** Velmi rozsáhlá aktualizace, která zavedla revoluční koncepty jako moduly (alternativa k hlavičkovým souborům), korutiny (pro asynchronní programování), koncepty (omezení pro šablony) a operátor porovnání "spaceship" (`<=>`).
- **2023 (C++23):** Nejnovější standard, který pokračuje v evoluci jazyka s dalšími vylepšeními knihoven (např. `std::print`, `std::stacktrace`) a menšími úpravami jádra jazyka.
💡 Filozofie a cíle
Bjarne Stroustrup navrhl C++ s několika klíčovými principy, které formují jeho charakter dodnes: 1. **Být lepším C:** C++ si klade za cíl zachovat plnou zpětnou kompatibilitu s jazykem C (s několika malými výjimkami). To umožňuje snadnou migraci C kódu a využití existujících C knihoven. 2. **Podpora abstrakce dat:** Jazyk umožňuje programátorům vytvářet vlastní datové typy (třídy), které se chovají stejně jako vestavěné typy. 3. **Podpora objektově orientovaného programování:** C++ poskytuje nástroje pro návrh softwaru pomocí objektů, dědičnosti a polymorfismu. 4. **Nulová režie (Zero-overhead principle):** Jedna z nejdůležitějších zásad. Znamená, že pokud nějakou jazykovou funkci nepoužíváte, neplatíte za ni žádnou penalizaci ve výkonu nebo paměti. A pokud ji používáte, nemohli byste ji napsat ručně efektivněji. 5. **Strojová nezávislost:** C++ je navržen tak, aby byl přenositelný mezi různými platformami, i když umožňuje nízkoúrovňové operace, které mohou být platformně specifické. 6. **Silná statická typová kontrola:** Kompilátor kontroluje typy proměnných již při překladu, což pomáhá odhalit mnoho chyb ještě před spuštěním programu.
⚙️ Klíčové vlastnosti
C++ je jazyk s obrovským množstvím funkcí. Mezi ty nejdůležitější patří:
Objektově orientované programování (OOP)
C++ je jedním z nejznámějších jazyků podporujících OOP paradigma. Jeho základními stavebními kameny jsou:
- **Třídy a objekty:** Třída je uživatelsky definovaný datový typ, který zapouzdřuje data (členské proměnné) a operace nad nimi (metody). Objekt je konkrétní instance třídy.
- **Zapouzdření:** Skrytí vnitřního stavu objektu a poskytnutí přístupu pouze přes veřejné rozhraní (metody). V C++ se k tomu používají specifikátory přístupu `public`, `protected` a `private`.
- **Dědičnost:** Umožňuje vytvářet nové třídy (potomky) odvozené od existujících tříd (předků). Potomek dědí vlastnosti a chování předka a může je rozšiřovat nebo modifikovat.
- **Polymorfismus:** Schopnost objektů různých tříd reagovat na stejnou zprávu (volání metody) odlišným způsobem. V C++ je realizován především pomocí virtuálních funkcí.
Generické programování
Tato vlastnost umožňuje psát kód, který pracuje s různými datovými typy, aniž by musel být pro každý typ přepsán. Základem jsou šablony (templates):
- **Šablony funkcí:** Umožňují vytvořit funkci, která může pracovat s argumenty různých typů.
- **Šablony tříd:** Umožňují vytvořit třídu, která může uchovávat a zpracovávat data různých typů. Nejznámějším příkladem je Standard Template Library (STL).
Standardní knihovna (STL)
STL je nedílnou součástí C++ a poskytuje bohatou sadu nástrojů a datových struktur. Její hlavní komponenty jsou:
- **Kontejnery:** Třídy pro ukládání kolekcí dat, např. `std::vector` (dynamické pole), `std::list` (spojový seznam), `std::map` (asociativní pole), `std::set` (množina).
- **Algoritmy:** Šablonové funkce pro operace nad kontejnery, např. `std::sort` (třídění), `std::find` (vyhledávání), `std::copy` (kopírování).
- **Iterátory:** Objekty, které poskytují jednotné rozhraní pro procházení prvků v kontejnerech, podobně jako ukazatele v C.
Správa paměti
C++ dává programátorovi plnou kontrolu nad správou paměti, což je klíčové pro výkon, ale zároveň zdrojem častých chyb.
- **Manuální správa:** Programátor alokuje paměť na haldě pomocí operátorů `new` a `new[]` a je zodpovědný za její uvolnění pomocí `delete` a `delete[]`. Pokud paměť neuvolní, dochází k únikům paměti.
- **RAII (Resource Acquisition Is Initialization):** Idiom, který spojuje životnost zdroje (paměť, soubor, síťové spojení) s životností objektu na zásobníku. Když objekt zaniká, jeho destruktor automaticky uvolní zdroj. Tento princip je základem pro chytré ukazatele.
- **Chytré ukazatele:** Objekty, které se chovají jako ukazatele, ale automaticky spravují paměť. Standardní knihovna od C++11 nabízí `std::unique_ptr` (výhradní vlastnictví), `std::shared_ptr` (sdílené vlastnictví s počítáním referencí) a `std::weak_ptr` (nezvyšuje počet referencí).
Moderní C++ (C++11 a novější)
Standardy od C++11 výrazně zjednodušily a zefektivnily psaní kódu. Mezi klíčové moderní prvky patří:
- **Lambda výrazy:** Anonymní funkce, které lze definovat přímo v místě použití.
- **Klíčové slovo `auto`:** Umožňuje kompilátoru automaticky odvodit typ proměnné z jejího inicializátoru.
- **Sémantika přesunu (Move semantics):** Umožňuje efektivní přesun zdrojů (např. velkých datových bloků) z jednoho objektu na druhý bez nákladného kopírování.
- **Podpora pro souběžnost:** Standardní knihovna obsahuje nástroje pro vícevláknové programování, jako jsou `std::thread`, `std::mutex` nebo `std::atomic`.
🛠️ Kompilace a standardizace
C++ je kompilovaný jazyk, což znamená, že zdrojový kód napsaný programátorem musí být přeložen do strojového kódu, kterému rozumí procesor počítače. Tento proces se obvykle skládá z několika kroků: 1. **Preprocessing:** Preprocesor zpracovává direktivy jako `#include` (vkládání obsahu jiných souborů) a `#define` (definice maker). 2. **Kompilace:** Kompilátor (překladač) překládá zpracovaný zdrojový kód do objektových souborů, které obsahují strojový kód, ale ještě nejsou spustitelné. 3. **Linkování:** Linker spojuje jeden nebo více objektových souborů a knihoven do finálního spustitelného souboru (např. `.exe` ve Windows) nebo knihovny.
Nejznámějšími kompilátory C++ jsou GCC (G++), Clang (používaný např. v Applu) a MSVC (součást Visual Studio).
Standardizace jazyka je v rukou mezinárodního výboru **ISO/IEC JTC1/SC22/WG21**. Tento výbor se skládá z odborníků z akademické sféry i průmyslu (zástupci firem jako Google, Microsoft, Intel) a schází se několikrát ročně, aby projednával návrhy na vylepšení jazyka.
🌍 Využití v praxi
Díky své rychlosti, kontrole nad hardwarem a obrovskému ekosystému knihoven se C++ používá v široké škále aplikací:
- **Herní průmysl:** Většina AAA herních enginů, jako je Unreal Engine nebo CryEngine, je napsána v C++. Jazyk umožňuje maximální výkon pro grafiku, fyziku a umělou inteligenci.
- **Systémové programování:** Jádra operačních systémů (Microsoft Windows, macOS, části Linuxu), ovladače zařízení a nízkoúrovňové utility.
- **Vysokofrekvenční obchodování (HFT):** Ve finančním sektoru, kde záleží na každé mikrosekundě, je C++ standardem pro algoritmické obchodní systémy.
- **Desktopové aplikace:** Mnoho výkonnostně náročných aplikací, jako jsou produkty od Adobe (Photoshop, Illustrator), 3D modelovací software (Autodesk Maya) nebo webové prohlížeče (Google Chrome, Mozilla Firefox), má své klíčové části napsané v C++.
- **Vědecké a výpočetní aplikace:** Pro simulace, numerické výpočty, analýzu dat a v oblastech jako strojové učení (např. knihovna TensorFlow).
- **Vestavěné systémy:** V automobilovém průmyslu, letectví, lékařských přístrojích a IoT zařízeních, kde je potřeba efektivní správa omezených zdrojů.
🤔 Výhody a nevýhody
Výhody
- **Vysoký výkon:** C++ poskytuje abstrakce s nulovou režií a umožňuje přímou manipulaci s pamětí, což vede k velmi rychlým aplikacím.
- **Kontrola nad hardwarem:** Možnost pracovat s pamětí na nízké úrovni, podobně jako v jazyce C.
- **Multiparadigmatický:** Podporuje různé styly programování, což dává programátorovi velkou flexibilitu.
- **Obrovský ekosystém:** Existuje obrovské množství knihoven a frameworků pro téměř jakýkoli účel (např. Boost, Qt).
- **Zpětná kompatibilita s C:** Většina C kódu je platným C++ kódem, což usnadňuje integraci.
- **Silná komunitní a průmyslová podpora:** Jazyk je neustále vyvíjen a podporován velkými technologickými firmami.
Nevýhody
- **Vysoká složitost:** Jazyk má obrovské množství funkcí a pravidel, což vede k dlouhé a strmé učící křivce.
- **Manuální správa paměti:** I přes existenci chytrých ukazatelů stále hrozí riziko chyb, jako jsou úniky paměti nebo přístup k neplatné paměti.
- **Nedefinované chování (Undefined Behavior):** Některé chybné operace (např. dereference nulového ukazatele) nejsou standardem definovány a mohou vést k nepředvídatelným pádům programu nebo bezpečnostním zranitelnostem.
- **Dlouhé časy kompilace:** U velkých projektů může překlad trvat velmi dlouho, i když moderní techniky jako moduly (C++20) se snaží tento problém řešit.
- **Složitá chybová hlášení:** Zejména při práci se šablonami mohou být chybová hlášení kompilátoru velmi dlouhá a nesrozumitelná.
🎓 Pro laiky
Představte si C++ jako stavebnici pro stavbu velmi rychlých a složitých strojů, například závodního auta.
- **Kompilovaný jazyk:** Než můžete "stroj" spustit, musíte nejprve vzít jeho plány (zdrojový kód) a v továrně (kompilátor) z nich vyrobit skutečný, funkční motor (spustitelný program). To se dělá jen jednou a výsledný motor je pak extrémně rychlý. Oproti tomu interpretované jazyky (jako Python) staví motor za chodu podle plánů, což je pomalejší.
- **Objektově orientované programování:** Místo toho, abyste stavěli auto z tisíců jednotlivých šroubků, pracujete s předpřipravenými součástkami (objekty), jako je motor, kolo nebo volant. Každá součástka má své vlastní vlastnosti (barvu, velikost) a umí dělat určité věci (motor se točí, volantem se zatáčí). To celý proces zjednodušuje a zpřehledňuje.
- **Manuální správa paměti:** C++ vám dává klíče od skladu se součástkami (paměť počítače). Můžete si vzít, co potřebujete, ale musíte to po sobě také uklidit. Pokud to neuděláte, ve skladu brzy dojde místo (únik paměti) a program přestane fungovat. Moderní C++ nabízí "chytré krabice" (chytré ukazatele), které se uklidí samy, jakmile je přestanete používat.
- **Blízkost k hardwaru:** C++ vám dovoluje "sáhnout si" přímo na jednotlivé součástky motoru a vyladit je pro maximální výkon. Jiné, jednodušší jazyky vám to nedovolí a nabízejí jen hotový motor s omezenými možnostmi nastavení.
💻 Příklad kódu
Klasický program "Hello, World!" v C++ vypadá následovně:
```cpp
- include <iostream>
// Hlavní funkce, kde program začíná int main() {
// Vytiskne text "Hello, World!" na standardní výstup (obvykle obrazovku) std::cout << "Hello, World!" << std::endl; // Vrátí 0, což signalizuje úspěšné ukončení programu return 0;
} ```
- `#include <iostream>`: Tento řádek říká preprocesoru, aby do našeho kódu vložil obsah souboru `iostream`. Tento soubor obsahuje definice pro vstupní a výstupní operace, jako je tisk na obrazovku.
- `int main()`: Toto je hlavní funkce. Každý program v C++ musí mít funkci `main`, protože právě zde začíná jeho vykonávání.
- `std::cout`: Je to objekt reprezentující standardní výstupní proud (obvykle konzole nebo terminál).
- `<<`: Operátor pro vložení dat do výstupního proudu.
- `"Hello, World!"`: Textový řetězec, který chceme vytisknout.
- `std::endl`: Manipulátor, který vloží znak nového řádku a vyprázdní výstupní buffer.
- `return 0;`: Ukončí funkci `main` a vrátí operačnímu systému hodnotu 0, což konvenčně znamená, že program proběhl v pořádku.