经信之窗--江苏频道--人民网
Tento ?lánok je potrebné aktualizova?, preto?e m??e obsahova? zastarané informácie. Prosím, pozrite si stránky v kategórii návody a ?lánok vhodne aktualizujte. Aktualizova? text oh?adom najnov?ieho/-ích ?tandardov. |
C++ | |
Druh | viacparadigmovy |
---|---|
Dátum vzniku | 1985, naposledy upraveny v 2020 |
Pou?itie | v?eobecné |
Typová kontrola | silná, statická, nie bezpe?ná |
Tvorca | Bjarne Stroustrup |
Implementácie | viacero |
Dialekty | ANSI C++ 1998, ANSI C++ 20044 |
Pou?ívané prípony | .cc, .cpp, .cxx, .C, .CC, .h, .hpp, .hh |
C++ je viacparadigmovy programovací jazyk vy??ej úrovne na v?eobecné pou?itie, ktory umo?ňuje pracova? aj s prostriedkami nízkej úrovne. Má statickú typovú kontrolu, podporuje procedurálne programovanie, dátovú abstrakciu, objektovo orientované programovanie, ale aj generické programovanie. Od 90-tych rokov 20. storo?ia patrí k najpopulárnej?ím programovacím jazykom, pou?íva ho a? vy?e 95 % engine-ov po?íta?ovych hier.
Bjarne Stroustrup vyvinul C++ (p?vodne nazvany ?C with Classes“) v roku 1983 v Bell Labs ako roz?írenie jazyka C. Roz?irovanie za?alo pridaním tried a nesk?r pokra?ovalo pridávaním ?al?ích vlastností ako sú virtuálne funkcie, prekryvanie operátorov, viacnásobná dedi?nos?, ?ablóny a o?etrenie vynimiek. ?tandard jazyka C++ bol schváleny v roku 1998 ako ISO/IEC 14882:1998, aktuálna verzia je z roku 2003 (ISO/IEC 14882:2003). Nová verzia ?tandardu (známa pod ozna?ením C++11 alebo C++0x) bola schválená v auguste 2011.
Dejiny
[upravi? | upravi? zdroj]E?te v roku 1979 Stroustrup za?al pracova? na ?C with Classes“ (C s triedami). Pri tvorbe nového jazyka vychádzal zo skúseností z dizerta?nej práce. Stroustrup zistil, ?e niektoré ?rty Simuly by boli mimoriadne u?ito?né pri vyvoji ve?kych softvérovych produktov, ale Simula je príli? pomalá na praktické pou?ívanie, zatia? ?o BCPL je rychle, ale príli? nízko-úrovňové a nevhodné na vyvoj v???ích projektov. Ke? Struostrup za?ínal pracova? pre Bell Labs jeho úlohou bolo analyzova? unixové jadro s prihliadnutím na distribuované vypo?ty. Vyu?ijúc skúsenosti z dizerta?nej práce smeroval k roz?íreniu jazyka C o ?rty aké mala Simula. Jazyk C si vybral kv?li jeho zameraniu na v?eobecné pou?itie, rychlosti a prenosite?nosti. Okrem jazykov C a Simula ho in?pirovali aj jazyky ALGOL 68, Ada, CLU a ML. Postupne pridával triedy, dedi?nos? tried, silnú typovú kontrolu, inline funkcie a ?tandardné hodnoty parametrov do jazyka C pomocou nástroja Cfront. Prvú ?tandardnú verziu vydal v októbri 1985.[1]
V roku 1983 sa zmenil názov jazyka z C with Classes na C++. Pribúdali nové ?rty ako virtuálne funkcie, pre?a?ovanie funkcií a operátorov, referencie, kon?tantné premenné, práca s haldou, zlep?ená typová kontrola a novy ?tyl komentárov na jeden riadok zapísany pomocou dvoch lomiek (//). Ke? bola v roku 1985 vydaná prvá verzia programovacieho jazyka C++ poskytovala d?le?ité odkazy na jazyk, ktoré sa ale e?te nestali oficiálnym ?tandardom. V roku 1989 vy?la verzia jazyka 2.0. Novymi vlastnos?ami boli viacnásobná dedi?nos?, abstraktné triedy, funkcie triedy (statické funkcie), kon?tantné ?lenské funkcie, neverejné atribúty (protected members). O rok nato vy?la referen?ná príru?ka (The Annotated C++ Reference Manual). Táto práca sa stala základom pre budúci ?tandard. Nedávno boli doplnené ?al?ie ?rty vrátane ?ablón, vynimiek, mennych priestorov, pretypovania a booleovského dátového typu.
Ako sa vyvíjal jazyk samotny, spolu s ním sa vyvíjali aj kni?nice. Prvá kni?nica pridaná k ?tandardu C++ bola kni?nica vstupno-vystupnych streamov, ktorá poskytovala nástroje nahrádzajúce funkcie jazyka C ako sú printf, alebo scanf. Nesk?r sa k najvyznamnej?ím roz?íreniam ?tandardu pridala STL (Standard Template Library).
Po rokoch práce po spojení komisie ANSI a ISO bol jazyk C++ ?tandardizovany v roku 1998 (ISO/IEC 14882:1998). O nieko?ko rokov po oficiálnom vydaní ?tandardu komisia zapracovala hlásenia chyb a vydala opravenú verziu ?tandardu v roku 2003. V roku 2005 bola schválená odborná správa nazvaná Library Technical Report 1 (?asto skrátene ozna?ovaná TR1). V???ina navrhovanych zmien v TR1 sa stala sú?as?ou C++11.
Aj ke? jazyk C++ je bezplatny, ?tandard nie je vo?ne dostupny.
Názov Cé plus plus
[upravi? | upravi? zdroj]Toto meno vytvoril Rick Mascitti (v roku 1983) a prvykrát bolo pou?ité v decembri 1983. Predtym, po?as vyskumu sa jazyk ozna?oval ako ?nové C“, potom ?C s triedami“ (C with classes). Kone?ny názov C++ pochádza z operátora ?++“ v jazyku C (ktory zvy?uje hodnotu premennej) a ?astej konvencie, ?e ?+“ sa pou?íva vo vyzname vylep?eny. Pod?a Stroustrupa: ?Meno znamená evolu?nú povahu zmien z jazyka C“. Predtym existoval nepríbuzny programovací jazyk nazvany C+.
Stroustrup sa nového mena ujal v za?iatkoch a v predslove k neskor?ím vydaniam knihy dodáva, ?e ?C++“ by mohlo by? odvodené z prílohy knihy ?1984“ od George Orwella. Z troch ?astí fiktívneho jazyka Newspeak, ?as? ?C vocabulary“ je ur?ená pre technické vyrazy a slang. Dvojité plus sa v Newspeaku pou?íva na vyjadrenia superlatívu prídavnych mien. Teda ?C++“ by mohlo ma? vyznam ?najtechnickej?í, alebo najslangovej?í“.
Ke? sa v roku 1992 Rick Mascitti neformálne pytal na meno jazyka, Stroustrup nazna?oval, ?e to bolo len také vnuknutie a nikdy by si nemyslel, ?e by sa mohlo sta? oficiálnym menom jazyka.
?astym ter?om vtipov byva názov jazyka. Postfix ++ znamená, ?e pripo?ítava? sa bude a? po operácii a teda jazyk by sa mal vola? ++C.
?al?í vyvoj
[upravi? | upravi? zdroj]Vyvoj C++ pokra?uje, aby jazyk dokázal uspokoji? aj budúce potreby. Najm? skupina Boost.org vytvára v???inu C++ v jeho sú?asnej podobe a radí ?tandardiza?nej komisii, ktoré rysy jazyka pracujú správne a ktoré by bolo dobré vylep?i?. Sú?asná práca ukazuje, ?e C++ bude získava? stále viac na svojej multiparadigmovej povahe. Napríklad kni?nica Boost ve?mi roz?iruje mo?nosti funkcionálneho programovania, ako aj metaprogramovania. Na novej verzii ?tandardu C++ sa pracuje. Nazyva sa C++0x (o?akáva sa, ?e vyjde v roku 2010) a bude zah?ňa? ve?a novych roz?írení.
Filozofia
[upravi? | upravi? zdroj]V knihe The Design and Evolution of C++ (1994), Bjarne Stroustrup popisuje niektoré pravidlá, ktoré pou?íva pri návrhu C++. Poznanie tychto pravidiel pomáha porozumie?, pre?o je tento jazyk taky aky je. Nasledujú tie pravidlá, ove?a podrobnej?ie sú v The Design and Evolution of C++.
- C++ je navrhnuty, aby to bol jazyk so statickou typovou kontrolou v?eobecne pou?ite?ny, ktory má efektivitu a prenosite?nos? jazyka C.
- C++ je navrhnuty tak, aby priamo a vy?erpávajúco podporoval nieko?ko ?tylov programovania (procedurálne programovanie, dátovú abstrakciu, objektovo-orientované programovanie a generické programovanie).
- C++ je navrhnuty tak, aby dal programátorovi na vyber. Dokonca mu umo?ňuje rozhodnú? sa nesprávne.
- C++ je navrhnuty tak, aby bol kompatibilny s jazykom C, tak ako je to mo?né. Preto je mo?ny hladky prechod z jazyka C.
- C++ sa vyhyba ?rtám, ktoré by boli platformovo závislé, alebo orientované len na istú sadu problémov.
- C++ nevynakladá ?iadnu ré?iu na roz?írenia, ktoré v programe nepou?ijeme.
- C++ je navrhnuty na fungovanie bez zlo?itého programovacieho prostredia.
Stanley B. Lippman podrobne popisuje rozli?né modely v knihe Inside the C++ Object Model (1996) ako kompilátor m??e previes? vyrazy jazyka C++ na pam??ovy model. Dodávatelia kompilátora nie sú obmedzovaní akym sp?sobom implementujú ?tandard. Lippman pracoval na implementácii a údr?be Cfront-u – prvotnej implementácie C++ v Bell Labs.
?tandardná kni?nica
[upravi? | upravi? zdroj]?tandard C++ z roku 1998 sa skladá z dvoch ?astí: samotného jazyka (tie? niekedy aj jadro jazyka) a C++ ?tandardnej kni?nice. Nesk?r zah?ňa v???inu z Standard Template Library a mierne upravenej verzie ?tandardnej kni?nice jazyka C. Existuje ve?a kni?níc C++, ktoré nie sú ?as?ou ?tandardu a pou?ívajú externé linkovanie. Kni?nice dokonca m??u by? napísané aj v jazyku C.
?tandardná kni?nica jazyka C++ zah?ňa ?tandardnú kni?nicu jazyka C s nieko?kymi malymi úpravami, aby umo?ňovala lep?iu prácu v jazyku C++. ?al?ia ve?ká ?as? kni?nice C++ je zalo?ená na Standard Template Library (STL). Táto poskytuje také u?ito?né nástroje ako sú kontajnery (napríklad vektor – pole, list – zre?azeny zoznam), iterátory (zov?eobecnené ukazovatele). Tieto kontajnery poskytujú podobny prístup ako pole a poskytujú operácie ako vyh?adávanie a triedenie. Kni?nica ?alej ponúka (multi)mapy (asociatívne polia), (multi)mno?iny, ktoré ponúkajú podobné rozhranie. Potom s pou?itím ?ablón je mo?né napísa? generické algoritmy, ktoré pracujú s ?ubovo?nym kontajnerom, alebo s ?ubovo?nou postupnos?ou definovanou pomocou iterátorov. Funkcie kni?nice sa rovnako ako v jazyku C zahrnú do programu pomocou direktívy #include
. C++ poskytuje ?es?desiatdev?? ?tandardnych hlavi?kovych súborov, ?al?ích dev?tnás? sa neodporú?a pou?íva? (ozna?ené ako zastárané, angl. deprecated).
Pou?ívanie ?tandardnej kni?nice (napríklad pou?ívanie std::vector, alebo std::string namiesto polí v ?tyle jazyka C) m??e vies? k bezpe?nej?iemu a ?ah?ie upravite?nému softvéru.
STL bola p?vodne kni?nica vyrobená a pou?ívaná firmou Hewlett-Packard a nesk?r Silicon Graphics, pred jej za?lenením do ?tandardu C++. ?tandard sa na ňu neodkazuje ako na ?STL“, ale len ako na ?as? ?tandardnej kni?nice, ale ve?a ?udí stále pou?íva tento pojem na odlí?enie od ostatnych ?astí kni?nice.
V???ina kompilátorov poskytuje implementáciu ?tandardu C++ vrátane STL. Existujú aj implementácie ?tandardu nezávislé na kompilátore (napr. STLPort). Iné projekty tie? vyrábajú rozli?né zákaznícke implementácie kni?nice jazyka a STL s rozli?nymi cie?mi návrhu.
Vlastnosti, ktoré priniesol jazyk C++
[upravi? | upravi? zdroj]V porovnaní s jazykom C, C++ priná?a nové vlastnosti, vrátane deklarácii, pretypovanie so syntaxou funkcií, new
/delete
, bool
, referencie, inline
funkcie, implicitné argumenty, pre?a?enie funkcií, priestory mien, triedy (zo v?etkymi ich ?rtami ako dedi?nos?, ?lenské funkcie, virtuálne funkcie, abstraktné triedy a kon?truktory), pre?a?enie operátorov, ?ablóna, operátor ::
, o?etrenie vynimiek, RTTI.
V rozpore s populárnou domnienkou, jazyk C++ nezaviedol k?ú?ové slovo const
ako prvy. Const bolo formálne pridané do jazyka C krátko predtym ako ho prevzalo C++.
C++ tie? v niektorych prípadoch poskytuje presnej?iu typovú kontrolu ako C (pozri ?Nekompatibilitu s jazykom C“ dole).
Komentáre za?ínajúce s dvomi lomkami (?//
“) boli p?vodne ?as?ou BCPL (predchodca C) a boli znovuzavedené v C++.
Niektoré roz?írenia C++ boli nesk?r prevzaté jazykom C. Je to deklarácia premennej v cykle for
, jednoriadkovy komentár (pou?ívajúci symbol //
), direktíva inline
(aj ke? definícia inline
pod?a C99 nie je plne zlú?ite?ná s C++). Ale C99 tie? prichádza s novymi roz?íreniami, ktoré v C++ neexistujú, napríklad makro s premennym po?tom parametrov, alebo polia s d??kou známou a? za behu. Niektoré kompilátory m??u implementova? ?as? tychto roz?írení, ale niektoré roz?írenia neumo?ňujú kompatibilitu s C++.
Ve?mi ?astym zdrojom nedorozumenia byva terminológia. Preto?e C++ je odvodené z jazyka C, pojem objekt znamená oblas? v pam?ti (presne ako v C) a nie in?tancia triedy, ?o je vyznam vo v???ine ostatnych objektovo orientovanych jazykoch. Napríklad, v oboch jazykoch (C aj C++) deklarácia int i;
definuje objekt typu int
, ?i?e oblas? v pam?ti, kde bude premenná i
ulo?ená.
C++ zdedilo v???inu syntaxe jazyka C a preprocesora jazyka C. Uvádzame program Hello world, ktory vyu?íva streamy zo ?tandardnej kni?nice na zápis správy na ?tandardny vystup.
#include <iostream>
int main()
{
std::cout << "Hello, world!\n";
}
Operátory a pre?a?enie operátorov
[upravi? | upravi? zdroj]C++ poskytuje viac ako 30 operátorov pou?ívanych na jednoduchú aritmetiku, operácie s bitmi, operácie so smerníkmi, porovnávanie, logické operácie a ?al?ie. Takmer v?etky operátory okrem pár vynimiek (ako sú . a .*) m??u by? pre?a?ené pre u?ívate?om definované typy. Pre?a?enie operátorov je tie? sú?as?ou mnohych programovacích techník ako sú napríklad inteligentné ukazovatele. Pre?a?enie operátorov neumo?ňuje zmeni? prioritu vyhodnotenia, ani po?et operandov, ktoré operátor pou?íva (ale operand m??e by? ignorovany).
?ablóny
[upravi? | upravi? zdroj]?ablóny jazyka C++ umo?ňujú genericky programova?. C++ podporuje ?ablóny funkcií aj tried. ?ablóny m??u by? parametrizované typmi, kon?tantami známymi v ?ase prekladu a inymi ?ablónami. ?ablóny sú implementované pomocou ?in?tancií“ vytváranych pri preklade. Na in?tancovanie ?ablóny kompilátor nahradí jej ?ablónové parametre konkrétnymi hodnotami, aby vygeneroval po?adovanú funkciu, alebo triedu. ?ablóny sú mocnym nástrojom, ktory sa m??e pou?i? pri generickom programovaní, alebo optimalizácii kódu, ale táto sila nie?o stojí. Pou?itie ?ablón m??e zv???i? ve?kos? kódu, preto?e ka?dá in?tancia ?ablóny vyrobí kópiu kódu ?ablóny. Pre ka?dú sadu ?ablónovych parametrov sa vytvára ?al?ia kópia kódu. Toto je rozdiel vo?i generovaniu za behu, ktory m??eme vidie? v inych jazykoch (napríklad v Jave), kde pri kompilácii sa vytvára sa len jediné telo ?ablóny. ?ablóny sa lí?ia od makier. Rovnako ako makrá sa prekladajú e?te pred spustením kódu a tie? umo?ňujú vytvori? podmieneny preklad. ?ablóny v?ak nie sú obmedzené len na nahradenie tokenov. ?ablóny poznajú sémantiku, typy ako aj definície typov a doká?u vykonáva? vysokoúrovňové operácie vrátane riadenia toku programu zalo?eného na vyhodnotení parametrov s prísnou typovou kontrolou. Makrá sú schopné podmieneného riadenia kompilácie zalo?eného na vopred známych kritériách. Nedoká?u vytvára? nové typy, rekurziu, alebo získava? hodnoty z typu a ich mo?nosti sú obmedzené na nahradenie textu po?as predsprácovania po?as kompilácie. ?ablóny sú nástrojom pre staticky polymorfizmus a generické programovanie. V skratke, ?ablóny sú pri preklade parametrizovate?né funkcie, alebo triedy napísané bez znalosti typovych argumentov pou?itych pri ich in?tancovaní. Po in?tancovaní je vysledny kód rovnaky ako kód napísany s dosadením ?ablónovych parametrov. Takto ?ablóny poskytujú sp?sob na oddelenie generickych aspektov funkcií a tried od ?pecifickych aspektov (ulo?enych v ?ablónovych parametroch) bez obetovania vykonnosti kv?li abstrakcii.
úvod
[upravi? | upravi? zdroj]Vyhodou C++ je, ?e u? má zabudovanú podporu objektov. Objekty sú dobré na r?zne veci. Sú aj modernej?ie jazyky ktoré zvládajú prefíkanej?ie metódy ako napr. C#, ale C++ je z objektovych jazykov najefektívnej?í (samozrejme v rukách skúseného programátora).
Zabalenie funkcionality (enkapsulácia)
[upravi? | upravi? zdroj]V C alebo asembleri treba na na?tartovanie nejakej funkcionality zavola? ve?a funkcií, napr. na inicializáciu, alokáciu pam?te a po skon?ení zas na ukon?enie a uvo?nenie pam?te. Niekedy to m??e by? dos? komplikované a nepreh?adné a dajú sa tu hlavne pod stresom robi? chyby ktoré sa potom ?a?ko h?adajú.
V C++ m??eme vyrobi? objekt, ktory toto v?etko spreh?adní a pekne ?isto zabalí, tak?e hlavne pri opakovanom pou?ití vyrazne zní?i chybovos?.
- Príklad
Chceme vytvori? jednoduchú strie?a?ku s obludami ktoré poletujú po obrazovke. K tomu budeme potrebova? obludy, ?o sú vlastne sprity — tak?e obludu vyrobíme tak, ?e ju odvodíme od spritu, ?o je v príklade u? hotová trieda Sprite. Tie? potrebujeme scénu na ktorej sa to odohráva a tu vyrobíme tak, ?e ju odvodíme od okna, ?o je hotová trieda Okno.
class Obluda : public Sprite //<-- odvodime od spritu
{
public:
Obluda(Okno* pOkno): Sprite(pOkno)
{
}
~Obluda()
{
}
};
class Scena : public Okno //<-- odvodime od okna
{
public:
int pridajObludu(Obluda)
{
}
};
Program pre jednoduché matematické operácie
[upravi? | upravi? zdroj]#include<iostream> // zahrnutie prudu, ktory umo?ňuje základne // vstupné a vystupné operácie int main () { int a, b; // deklarácia premennych int result; a = 7; b = 3; a = a + 1; result = a - b; std::cout << result; return 0; }
Tak ako pri jazyku C, aj program v C++ musí obsahova? funkciu main
, ktorá vracia celo?íselnú hodnotu.
Tento program po?íta jednoduché matematické operácie a vysledok vypí?e na ?tandardny vystup. Najsk?r sa premennej a
priradí hodnota 7, premennej b
sa priradí hodnota 3 a potom sa hodnota a zv???í o 1. Premennej result
sa priradí hodnota rozdielu premennych a
a b
. Nakoniec sa vypí?e hodnota premennej result
.
Vystup programu: 5
Referencie
[upravi? | upravi? zdroj]- ↑ Bjarne Stroustrup's FAQ - When was C++ invented? [online]. [Cit. 2025-08-05]. Dostupné online.
Pozri aj
[upravi? | upravi? zdroj]Iné projekty
[upravi? | upravi? zdroj]Commons ponúka multimediálne súbory na tému C++