C++

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání
C++
Paradigma: multiparadigmatický
Vznikl v: 1983
Autor: Bjarne Stroustrup
Poslední verze: ISO/IEC 14882:2003 / 2003
Typová kontrola: statické, slabé, nominativní
Hlavní implementace: G++ (GNU C++),
Microsoft Visual C++,
Borland C++Builder
Clang
Dialekty: ISO/IEC 14882:1998
ISO/IEC 14882:2003
Ovlivněn jazyky: C, Simula, Ada 83, ALGOL 68, CLU, ML
Ovlivnil jazyky: Ada 95, C#, Java, PHP, D, Aikido, Dao
Web: http://www.stroustrup.com/C++.html

C++ je multiparadigmatický programovací jazyk, který vyvinul Bjarne Stroustrup a další v Bellových laboratořích AT&T rozšířením jazyka C. C++ podporuje několik programovacích stylů (paradigmat) jako je procedurální programování, objektově orientované programování a generické programování, není tedy jazykem čistě objektovým. V současné době patří C++ mezi nejrozšířenější programovací jazyky.

Historie[editovat | editovat zdroj]

Název C++[editovat | editovat zdroj]

Starší verze jazyka, společně označované jako „C with Classes“ (česky C s třídami), byly používány od roku 1980. Jméno C++ vymyslel Rick Mascitti v létě 1983. Toto jméno zdůrazňuje evoluční povahu změn oproti jazyku C; „++“ je operátor inkrementace v C. Poněkud kratší jméno „C+“ je syntaktická chyba, bylo též použito jako jméno jiného nesouvisejícího jazyka.

Standardy C++[editovat | editovat zdroj]

Přestože byl jazyk vyvíjen již od počátku 80. let, první oficiální norma C++ byla přijata v roce 1998, další v roce 2003 (INCITS/ISO/IEC 14882-2003). V roce 2006 a 2007 byly přijaty některé aktualizace. Současný standard, neformálně označovaný jako C++11, značně rozšiřuje C++ a byl přijat organizací ISO v září 2011 jako ISO/IEC 14882:2011.[1]

Kompatibilita s jazykem C[editovat | editovat zdroj]

Jazyk C je až na několik jasně definovaných výjimek podmnožinou C++. Jak uvádí Bjarne Stroustrup, všechny programy uvedené ve slavné učebnici jazyka C The C Programming Language od Briana W. Kernighana a Dennise M. Ritchieho jsou zároveň programy v C++.

První překladače C++ byly preprocesory, které překládaly z C++ do čistého C. Považovat jazyk C++ za pouhé rozšíření jazyka C by ale bylo chybou, protože není s jazykem C zcela kompatibilní. Některé programy v jazyce C nelze překládat překladači pro C++.

Vlastnosti jazyka a rozdíly oproti jazyku C[editovat | editovat zdroj]

Objekty[editovat | editovat zdroj]

Koncepce objektů jazyka C++ byla převzata z jazyka Simula 67. Objekty (třídy) jsou pojaty jako přirozené rozšíření datových struktur jazyka C o možnost vkládání členských funkcí. C++ umožňuje řídit viditelnost složek objektů pro ostatní části programu.

Primitivní typy[editovat | editovat zdroj]

C++ obsahuje 14 primitivních datových typů, jeden pro uložení logických hodnot, dva (znaménkový a bezznaménkový) pro uložení znaků, čtyři typy pro uložení celých čísel, každý v znaménkové a bezznaménkové verzi) a tři typy pro uložení čísel s plovoucí desetinnou čárkou.

  • bool – logická hodnota, velikost 1 B
  • (unsigned) char – ASCII znak, velikost 1 B
  • (unsigned) short – celočíselný typ o délce 2 B
  • (unsigned) long – celočíselný typ o délce 4 B
  • (unsigned) int – celočíselný typ, záleží na kompilátoru, zda má velikost 2 B či 4 B
  • (unsigned) long long – celočíselný typ o délce 8 B
  • float – typ pro čísla s plovoucí desetinnou čárkou, velikost 4 B
  • double – typ pro čísla s plovoucí desetinnou čárkou, velikost 8 B
  • long double – typ pro čísla s plovoucí desetinnou čárkou, velikost 10 B

Přetypování[editovat | editovat zdroj]

Na rozdíl od jiných jazyků obsahuje C++ čtyři metody přetypování.

  • Statické přetypování – static_cast<> – slouží k přetypování primitivních typů nebo rychlému přetypování objektů. Vzhledem k tomu, že neprobíhají při přetypování kontroly je doporučeno takto přetypovat pouze objekty, u kterých je již při kompilaci známo, že je lze přetypovat na cílový typ.
  • Dynamické přetypování – dynamic_cast<> – slouží k přetypování ukazatelů nebo referencí na objekty. Při přetypování dochází ke kontrolám, v případě chyby při přetypování ukazatelů je vrácena hodnota NULL, v případě chyby při přetypování referencí je vyhozena výjimka std::bad_cast.
  • Obecné přetypování – reinterpret_cast<> – slouží k přetypování nesouvisejících dat. Například pole znaků je takto možné přetypovat na strukturu se stejným počtem znaků.
  • Konstantní přetypování – const_cast<> – umožňuje přetypovat konstantní proměnnou na nekonstantní a obráceně.

Šablony[editovat | editovat zdroj]

Šablony rozšiřují znovupoužitelnost kódu, neboť umožňují napsat kód se zcela obecným (neurčeným) datovým typem. Jiné jazyky mohou dosáhnout stejné funkcionality použitím kořene objektové hierarchie nebo genericitou.

Přetěžování funkcí a operátorů[editovat | editovat zdroj]

Jazyk C++ umožňuje deklarovat více funkcí se stejným názvem. Kompilátor určí správné volání podle počtu a typu argumentů. Tato technika se nazývá přetěžování funkcí. Velmi silnou vlastností jazyka je i možnost přetěžovat standardní operátory (například '+' nebo '=') a tak přirozeně využívat tyto operátory pro nově vytvářené třídy a tvorbu abstraktních datových typů.

Dědičnost[editovat | editovat zdroj]

V C++ existuje na rozdíl od jiných jazyků vícenásobná dědičnost, tj. třída C může dědit od třídy A i B. Pro případ, že by třídy B a C dědily od A a třída D dědila od B i C je nutno u tříd B a C použít virtuální dědění. Kromě virtuální dědičnosti má ještě C++ tři druhy klasické dědičnosti:

  • public (veřejná), veřejné metody základní třídy jsou dostupné zvenčí odvozené třídy, chráněné metody základní třídy jsou dostupné pouze uvnitř odvozené třídy a od ní odvozených tříd,
  • protected (chráněná), veřejné a chráněné metody základní třídy jsou dostupné pouze uvnitř odvozené třídy a od ní odvozených tříd,
  • private (soukromá), veřejné a chráněné základní třídy metody jsou dostupné pouze uvnitř odvozené třídy.

Polymorfismus[editovat | editovat zdroj]

C++ umožňuje překrývat metody v základních třídách metodami z rozšířených tříd. Tento mechanismus se jmenuje polymorfismus. Pro využití polymorfismu je nutné v základní třídě u polymorfické metody uvést klíčové slovo virtual. Polymorfismus je podobný přetěžování, ale u přetěžování probíhá rozhodování o tom, která metoda se bude volat při překladu, u polymorfismu až za běhu.

RTTI[editovat | editovat zdroj]

Podrobnější informace naleznete v článku RTTI.

Run-Time Type Information resp. Run-Time Type Identification je způsob, jakým se v C++ získávají informace o typu objektu za běhu programu. RTTI se skládá z dvou hlavních částí, operátoru informací o typu typeid a operátoru přetypování dynamic_cast<>.

Standardní knihovna[editovat | editovat zdroj]

Standard jazyka C++ z roku 1998 se skládá ze dvou částí: popis jazyka a standardní knihovny. Standardní knihovna jazyka C++ obsahuje mírně modifikovanou verzi standardní knihovny jazyka C a Standard Template Library (STL).

Standard Template Library[editovat | editovat zdroj]

STL obsahuje velké množství užitečných datových struktur a algoritmů, jako například vektory (vylepšené pole), spojové seznamy, iterátory, zobecněné ukazatele, (multi)mapy, (multi)sety. Všechny tyto struktury mají konzistentní rozhraní. S použitím šablon je pak možné programovat generické algoritmy schopné pracovat s kterýmkoliv kontejnerem nebo sekvencí definovanou iterátory.

Používání standardní knihovny – například používání std::vector nebo std::string místo polí ve stylu jazyka C – může vést k bezpečnějšímu a lépe škálovatelnému softwaru.

STL byla původně vytvořena a používána firmou Hewlett-Packard a později také Silicon Graphics. Standard se na ni neodkazuje jako na „STL“, ale jen jako na část standardní knihovny, přesto mnoho lidí stále používá tento pojem na odlišení od ostatních částí knihovny.

Většina překladačů poskytuje implementaci standardu C++ včetně STL. Existují také implementace standardu nezávislé na kompilátoru (např. STLPort[pozn. 1]). Jiné projekty také vytvářejí různé zákaznické implementace knihovny jazyka a STL s různými cíli návrhu.

Příklady[editovat | editovat zdroj]

„Hello, World!“[editovat | editovat zdroj]

Následující jednoduchá aplikace vypíše „Hello, world!“ na standardní výstup.

  1. #include <iostream> // zpřístupní komponenty hlavičkového souboru iostream (in-stream a out-stream)
    
  2.  
    
  3. int main(int argc, char *argv[]) { // hlavní funkce programu
    
  4.     std::cout << "Hello, world!" << std::endl; // vypsání „Hello, world!“ na standardní výstup
    
  5.     return 0; // konec programu, return označuje ukončení funkce a navrácení hodnoty, v tomto případě úspěch (nula)
    
  6. }
    

Parametry programu[editovat | editovat zdroj]

Tato aplikace vypíše všechny argumenty programu zadané při spuštění

  1. #include <iostream>
    
  2.  
    
  3. using namespace std; // program používá komponenty z jmenného prostoru std, ekvivalent k prefixu std::.
    
  4.  
    
  5. int main(int argc, char *argv[]) {
    
  6.     for(int i = 0; i < argc; i++)     {
    
  7.         cout << i + 1 << ": " << argv[i] << endl; // argv obsahuje cestu ke souboru spuštěného programu a jeho parametry spuštění
    
  8.     }
    
  9.     return 0;
    
  10. }
    

Polymorfismus[editovat | editovat zdroj]

Pro zkrácení kódu je uvedena deklarace a definice tříd najednou. Správně by deklarace měla být v hlavičkovém souboru, definice v souboru s kódem. Navíc je doporučeno, aby každá třída byla v samostatném souboru.

  1. #include <cstdlib>
    
  2. #include <iostream>
    
  3. #include <string>
    
  4.  
    
  5. class A {
    
  6. protected:
    
  7.     // Konstantní metoda (nemění datové položky třídy, viz poslední const) pro zamezení opakování stejného kódu.
    
  8.     std::string formatuj(const std::string &s) const { // předání konstantní referencí
    
  9.         return s + '\n';
    
  10.     }
    
  11.  
    
  12. public:
    
  13.     virtual std::string vypisAhoj() const {
    
  14.         return formatuj("Ahoj z A");
    
  15.     }
    
  16.  
    
  17.     std::string vypisCau() const { // není virtual
    
  18.         return formatuj("Cau z A");
    
  19.     }
    
  20. };
    
  21.  
    
  22. class B : public A {
    
  23. public:
    
  24.     std::string vypisAhoj() const { // virtual zde není nutné, ale je doporučené
    
  25.         return formatuj("Ahoj z B");
    
  26.     }
    
  27.  
    
  28.     std::string vypisCau() const {
    
  29.         return formatuj("Cau z B");
    
  30.     }
    
  31. };
    
  32.  
    
  33. int main(int argc, char *argv[]) {
    
  34.     A a;
    
  35.     std::cout << a.vypisAhoj(); // „Ahoj z A“
    
  36.     std::cout << a.vypisCau();  // „Čau z A“
    
  37.  
    
  38.     B b;
    
  39.     std::cout << b.vypisAhoj(); // „Ahoj z B“
    
  40.     std::cout << b.vypisCau();  // „Čau z B“, viz řádek 44
    
  41.  
    
  42.     A *aPtr = &b;
    
  43.     std::cout << aPtr->vypisAhoj(); // „Ahoj z B“, zavolá se metoda z B
    
  44.     std::cout << aPtr->vypisCau();  // „Čau z A“, zavolá se metoda z A, protože kvůli chybějícímu virtual není metoda překrytá, viz řádek 40
    
  45.  
    
  46.     B *bPtr = dynamic_cast<B*>(aPtr); // přetypování aPtr na B*
    
  47.     if (bPtr != NULL) { // pokud se povedlo přetypovat
    
  48.         std::cout << bPtr->vypisAhoj(); // „Ahoj z B“
    
  49.         std::cout << bPtr->vypisCau();  // „Čau z B“, zavolá se metoda z B, protože bPtr je typu B*
    
  50.     } else {
    
  51.         std::cout << "aPtr není typu B*" << std::endl; // vypsání chybové hlášky
    
  52.     }
    
  53.  
    
  54.     return EXIT_SUCCESS; // vrácení nuly (úspěch)
    
  55. }
    

Algoritmy[editovat | editovat zdroj]

Ve standardní knihovně jsou k dispozici algoritmy pro práci s datovými strukturami. Na příkladu je pomocí standardních algoritmů vygenerována a vypsána Fibonacciho posloupnost.

  1. #include <algorithm>
    
  2. #include <iostream>
    
  3. #include <vector>
    
  4.  
    
  5. /**
    
  6.  * Třída vygeneruje při volání přetíženého operátoru volání funkce (funktoru)
    
  7.  * následující číslo z Fibonnaciho poslouposti
    
  8.  */
    
  9. class Generator {
    
  10. private:
    
  11.     int i; // předposlední číslo F. posloupnosti
    
  12.     int j; // poslední číslo F. poslopnosti
    
  13.     int krok; // počet vygenerovaných čísel F. poslopnosti
    
  14.  
    
  15. public:
    
  16.     Generator() : i(0), j(1), krok(0) { // jeden ze způsobů inicializace složek třídy v C++
    
  17.     }
    
  18.  
    
  19.     int operator () () {
    
  20.         int vratit = 0; // pro 0. krok
    
  21.         if (krok == 1) { // pro 1. krok
    
  22.             vratit = 1;
    
  23.         } else if (krok > 1) { // pro ostatní kroky
    
  24.             vratit = i + j; // výpočet další hodnoty
    
  25.             i = j; // dvoukroková příprava na výpočet následující hodnoty
    
  26.             j = vratit;
    
  27.         }
    
  28.         krok++;
    
  29.         return vratit;
    
  30.     }
    
  31. };
    
  32.  
    
  33. /**
    
  34.  * Funkce vypíše předané číslo na standardní výstup a odřádkuje.
    
  35.  */
    
  36. void vypisovac(int i) {
    
  37.     std::cout << i << std::endl;
    
  38. }
    
  39.  
    
  40. int main(int argc, char *argv[]) {
    
  41.     Generator f; // instance generátoru Fibonacciho posloupnosti
    
  42.     std::vector<int> vektor(20); // vytvoření vektoru s kapacitou 20
    
  43.     std::generate(vektor.begin(), vektor.end(), f); // vygenerování hodnot do vektoru, generátor je zde funktor
    
  44.     std::for_each(vektor.begin(), vektor.end(), &vypisovac); // vypsání posloupnosti pomocí algoritmu for_each a funkce vypisovac
    
  45.     return EXIT_SUCCESS; // vrácení nuly (úspěch)
    
  46. }
    

Odkazy[editovat | editovat zdroj]

Poznámky[editovat | editovat zdroj]

  1. Oficiální stránky STLPort

Reference[editovat | editovat zdroj]

  1. ISO/IEC 14882:2011 [online]. ISO, [cit. 2011-08-03]. Dostupné online.  

Literatura[editovat | editovat zdroj]

Související články[editovat | editovat zdroj]

Knihovny[editovat | editovat zdroj]

Software pro vývoj[editovat | editovat zdroj]

Externí odkazy[editovat | editovat zdroj]