C++
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.
Paradigma | multiparadigmatický, procedurální, funkcionální, objektově orientovaný, generický |
---|---|
Vznikl v | 1985 (před 37 lety) |
Autor | Bjarne Stroustrup |
Poslední verze | C++20 ISO/IEC 14882:2020 (15. prosince 2020) |
Typová kontrola | statické, slabé, nominativní, částečně inferentní |
Hlavní implementace | G++ (GNU C++), Microsoft Visual C++, Borland C++Builder Clang |
Dialekty | ISO/IEC 14882:1998 ISO/IEC 14882:2003 ISO/IEC 14882:2011 ISO/IEC 14882:2014 ISO/IEC 14882:2017 ISO/IEC 14882:2020 |
Ovlivněn jazyky | C, Simula, Ada 83, ALGOL 68, CLU, ML |
Ovlivnil jazyky | Ada 95, C#, Java, PHP, D, Aikido, Dao |
OS | multiplatformní |
Web | http://www.stroustrup.com/C++.html |
Přípona souboru | .C, .cc, .cpp, .cxx, .c++, .h, .hh, .hpp, .hxx, .h++ |
Historie
Název C++
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. Kratší jméno „C+“ je syntaktická chyba a bylo též použito jako jméno jiného nesouvisejícího jazyka.
Standardy C++
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. Standard označovaný jako C++11, značně rozšířil C++ a byl přijat organizací ISO v září 2011 jako ISO/IEC 14882:2011.[1] Současný standard je C++20 (ISO/IEC 14882:2020).
Kompatibilita s jazykem C
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
Primitivní typy
C++ obsahuje 18 primitivních datových typů.
Celá čísla:
Typ | Velikost | Rozsah | Znaménko |
---|---|---|---|
char | jako signed char nebo unsigned char | ||
signed char | min. 8 bitů | alespoň -128 až 127 | ano |
unsigned char | min. 8 bitů | alespoň 0 až 255 | ne |
short | min. 16 bitů | alespoň -32768 až 32767 | ano |
unsigned short | min. 16 bitů | alespoň 0 až 65535 | ne |
int | min. 16 bitů | alespoň -32768 až 32767 | ano |
unsigned int | min. 16 bitů | alespoň 0 až 65535 | ne |
long | min. 32 bitů | alespoň -2147483648 až 2147483647 | ano |
unsigned long | min. 32 bitů | alespoň 0 až 4294967295 | ne |
long long | min. 64 bitů | alespoň -9223372036854775808 až 9223372036854775807 | ano |
unsigned long long | min. 64 bitů | alespoň 0 až 18446744073709551615 | ne |
Čísla s plovoucí desetinnou čárkou:
Typ | Popis |
---|---|
float | jednoduchá přesnost (obvykle 32 bitů) |
double | dvojitá přesnost (obvykle 64 bitů) |
long double | rozšířená přesnost (obvykle 80 nebo 128 bitů) |
Znaky:
Typ | Velikost |
---|---|
char | min. 8 bitů |
wchar_t | 16 nebo 32 bitů |
char16_t | 16 bitů |
char32_t | 32 bitů |
Logická hodnota:
Typ | Velikost |
---|---|
bool | min. 8 bitů |
Objekty
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.
Modifikátory viditelnosti
Modifikátor | Kdo může přistupovat k dané složce |
---|---|
public | kdokoli |
protected | stejná třída nebo potomek |
private | stejná třída |
Dědičnost
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á), modifikátory oprávnění zděděných metod a atributů se nezměníprotected
(chráněná), veřejné a chráněné složky základní třídy budou v odvozené třídě chráněnéprivate
(soukromá), veřejné a chráněné složky základní třídy budou v odvozené třídě soukromé
Polymorfismus
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
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<>
.
Přetypování
Na rozdíl od jiných jazyků obsahuje C++ čtyři metody přetypování.
- Statické přetypování –
static_cast<typ>(výraz)
– slouží k přetypování primitivních typů nebo rychlému přetypování objektů. Vzhledem k tomu, že při přetypování neprobíhají 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<typ>(výraz)
– 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ýjimkastd::bad_cast
. - Obecné přetypování –
reinterpret_cast<typ>(výraz)
– 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<typ>(výraz)
– umožňuje přidávat a odebírat modifikátoryconst
avolatile
.
C++ také podporuje přetypování (typ)výraz
převzaté z jazyka C.
Šablony
Š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ů
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ů.
Standardní knihovna
Standard jazyka C++ z roku 1998 se skládá ze dvou částí: popisu 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
STL obsahuje velké množství užitečných datových struktur a algoritmů, jako například vektory (dynamické 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
„Hello, World!“
Následující jednoduchá aplikace vypíše „Hello, world!“ na standardní výstup.
#include <iostream> // zpřístupní komponenty hlavičkového souboru iostream (in-stream a out-stream)
int main(int argc, char *argv[]) { // hlavní funkce programu
std::cout << "Hello, world!" << std::endl; // vypsání „Hello, world!“ na standardní výstup
return 0; // konec programu, return označuje ukončení funkce a navrácení hodnoty, v tomto případě úspěch (nula)
}
Parametry programu
Tato aplikace vypíše všechny argumenty programu zadané při spuštění
#include <iostream>
int main(int argc, char *argv[]) {
for(int i = 0; i < argc; i++) {
std::cout << i + 1 << ": " << argv[i] << std::endl; // argv obsahuje cestu k souboru spuštěného programu a jeho parametry spuštění
}
return 0;
}
Polymorfismus
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.
#include <iostream>
#include <string>
class A {
public:
virtual std::string ahoj() { // je virtual
return "Ahoj z A\n";
}
std::string cau() { // není virtual
return "Cau z A\n";
}
};
class B : public A {
public:
virtual std::string ahoj() { // virtual zde není nutné, ale je doporučené
return "Ahoj z B\n";
}
std::string cau() {
return "Cau z B\n";
}
};
int main(int argc, char *argv[]) {
A a;
std::cout << a.ahoj(); // „Ahoj z A“
std::cout << a.cau(); // „Čau z A“
B b;
std::cout << b.ahoj(); // „Ahoj z B“
std::cout << b.cau(); // „Čau z B“, viz řádek 44
A *aPtr = &b;
std::cout << aPtr->ahoj(); // „Ahoj z B“, zavolá se metoda z B
std::cout << aPtr->cau(); // „Čau z A“, zavolá se metoda z A, protože kvůli chybějícímu virtual není metoda překrytá, viz řádek 40
B *bPtr = dynamic_cast<B*>(aPtr); // přetypování aPtr na B*
if (bPtr != nullptr) { // pokud se povedlo přetypovat
std::cout << bPtr->ahoj(); // „Ahoj z B“
std::cout << bPtr->cau(); // „Čau z B“, zavolá se metoda z B, protože bPtr je typu B*
} else {
std::cout << "aPtr není typu B*" << std::endl; // vypsání chybové hlášky
}
return 0;
}
Algoritmy
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.
#include <algorithm>
#include <iostream>
#include <vector>
/**
* Třída vygeneruje při volání přetíženého operátoru volání funkce (funktoru)
* následující číslo z Fibonacciho poslouposti
*/
class Generator {
private:
int i; // předposlední číslo F. posloupnosti
int j; // poslední číslo F. posloupnosti
int krok; // počet vygenerovaných čísel F. poslopnosti
public:
Generator() : i(0), j(1), krok(0) { // jeden ze způsobů inicializace složek třídy v C++
}
int operator () () {
int vratit = 0; // pro 0. krok
if (krok == 1) { // pro 1. krok
vratit = 1;
} else if (krok > 1) { // pro ostatní kroky
vratit = i + j; // výpočet další hodnoty
i = j; // dvoukroková příprava na výpočet následující hodnoty
j = vratit;
}
krok++;
return vratit;
}
};
/**
* Funkce vypíše předané číslo na standardní výstup a odřádkuje.
*/
void vypisovac(int i) {
std::cout << i << std::endl;
}
int main(int argc, char *argv[]) {
Generator f; // instance generátoru Fibonacciho posloupnosti
std::vector<int> vektor(20); // vytvoření vektoru s kapacitou 20
std::generate(vektor.begin(), vektor.end(), f); // vygenerování hodnot do vektoru, generátor je zde funktor
std::for_each(vektor.begin(), vektor.end(), &vypisovac); // vypsání posloupnosti pomocí algoritmu for_each a funkce vypisovac
return EXIT_SUCCESS; // vrácení nuly (úspěch)
}
Varianty
Rozšířeními jazyka C++ jsou C++/CLI a C++/CX od Microsoftu a Objective-C++ od Applu.
Odkazy
Poznámky
Reference
- ISO/IEC 14882:2011 [online]. ISO [cit. 2011-08-03]. Dostupné online.
Literatura
- STROUSTRUP, Bjarne. The C++ Programming Language. 4. vyd. [s.l.]: Addison-Wesley, 2013. ISBN 978-0-321-56384-2. (anglicky)
- The C++ Standard: Incorporating Technical Corrigendum No. 1. [s.l.]: John Wiley & Sons Inc, 2003. 816 s. ISBN 978-0-470-84674-2. (anglicky)
- KERNIGHAN, Brian; RITCHIE, Dennis. The C Programming Language. 2. vyd. [s.l.]: Prenctice Hall, 1988. Dostupné v archivu pořízeném dne 2012-12-02. ISBN 0-13-110370-9. (anglicky) Archivováno 2. 12. 2012 na Wayback Machine
- VIRIUS, Miroslav. Programování v C++. 2. vydání. vyd. Praha: České vysoké učení technické, 2004. ISBN 80-01-02978-6.
- JONES, Bredley; LIBERTY, Jesse. Naučte se C++ za 21 dní. 2. aktualizované vydání. vyd. [s.l.]: Computer Press, 2007. 800 s. ISBN 978-80-25-11583-1.
- ŠALOUN, Petr. Programovací jazyk C++ pro zelenáče. Praha: Neocortex, 2005. ISBN 80-86330-18-4.
- KOENIG, Andrew; MOO, Barbara. Rozumíme C++. [s.l.]: Computer Press 412 s. ISBN 978-80-72-26656-2.
- ČEPEK, Aleš. Úvod do C++. Praha: České vysoké učení technické, 2004.
- STROUSTRUP, Bjarne. C++ Programovací jazyk. 1.. vyd. [s.l.]: BEN - technická literatura ISBN 80-86056-20-1, ISBN 80-90150-72-1.
Knihovny
Software pro vývoj
Externí odkazy
- Obrázky, zvuky či videa k tématu C++ na Wikimedia Commons
- (anglicky) stroustrup.com – domovská stránka Bjarne Stroustrupa; mimo jiné uvádí historii C++, odpovědi na často kladené otázky a podrobný glosář. Jde o základní zdroj informací a odkazů věnovaných C++.
- builder.cz, sekce C, C++
- vsb.cz, český tutoriál programování v C++
- (anglicky) cplusplus.com – referenční příručka
- (anglicky) Thinking in C++ – dvoudílná učebnice od Bruce Eckela, volně ke stažení. První díl vyšel knižně i v českém jazyce.