C++
C++ je viacparadigmový programovací jazyk vyššej úrovne na všeobecné použitie, ktorý 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čových hier.
C++ | |
Druh | viacparadigmový |
---|---|
Dátum vzniku | 1985, naposledy upravený 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++ 2003 |
Používané prípony | .cc, .cpp, .cxx, .C, .CC, .h, .hpp, .hh |
Bjarne Stroustrup vyvinul C++ (pôvodne nazvaný „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, prekrývanie operátorov, viacnásobná dedičnosť, šablóny a ošetrenie výnimiek. Štandard jazyka C++ bol schválený 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
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 vývoji veľkých softvérových produktov, ale Simula je príliš pomalá na praktické používanie, zatiaľ čo BCPL je rýchle, ale príliš nízko-úrovňové a nevhodné na vývoj väčších projektov. Keď Struostrup začínal pracovať pre Bell Labs jeho úlohou bolo analyzovať unixové jadro s prihliadnutím na distribuované výpoč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, rýchlosti 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 nový štýl komentárov na jeden riadok zapísaný 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. Novými 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, výnimiek, menných priestorov, pretypovania a booleovského dátového typu.
Ako sa vyvíjal jazyk samotný, spolu s ním sa vyvíjali aj knižnice. Prvá knižnica pridaná k štandardu C++ bola knižnica vstupno-výstupných streamov, ktorá poskytovala nástroje nahrádzajúce funkcie jazyka C ako sú printf, alebo scanf. Neskôr sa k najvýznamnejším rozšíreniam štandardu pridala STL (Standard Template Library).
Po rokoch práce po spojení komisie ANSI a ISO bol jazyk C++ štandardizovaný v roku 1998 (ISO/IEC 14882:1998). O niekoľko rokov po oficiálnom vydaní štandardu komisia zapracovala hlásenia chýb 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 navrhovaných zmien v TR1 sa stala súčasťou C++11.
Aj keď jazyk C++ je bezplatný, štandard nie je voľne dostupný.
Názov Cé plus plus
Toto meno vytvoril Rick Mascitti (v roku 1983) a prvýkrát bolo použité v decembri 1983. Predtým, počas výskumu sa jazyk označoval ako „nové C“, potom „C s triedami“ (C with classes). Konečný názov C++ pochádza z operátora „++“ v jazyku C (ktorý zvyšuje hodnotu premennej) a častej konvencie, že „+“ sa používa vo význame vylepšený. Podľa Stroustrupa: „Meno znamená evolučnú povahu zmien z jazyka C“. Predtým existoval nepríbuzný programovací jazyk nazvaný 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é výrazy a slang. Dvojité plus sa v Newspeaku používa na vyjadrenia superlatívu prídavných mien. Teda „C++“ by mohlo mať význam „najtechnickejší, alebo najslangovejší“.
Keď sa v roku 1992 Rick Mascitti neformálne pýtal 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.
Častým terčom vtipov býva názov jazyka. Postfix ++ znamená, že pripočítavať sa bude až po operácii a teda jazyk by sa mal volať ++C.
Ďalší vývoj
Vývoj 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. Nazýva sa C++0x (očakáva sa, že vyjde v roku 2010) a bude zahŕňať veľa nových rozšírení.
Filozofia
V knihe The Design and Evolution of C++ (1994), Bjarne Stroustrup popisuje niektoré pravidlá, ktoré používa pri návrhu C++. Poznanie týchto pravidiel pomáha porozumieť, prečo je tento jazyk taký aký je. Nasledujú tie pravidlá, oveľa podrobnejšie sú v The Design and Evolution of C++.
- C++ je navrhnutý, aby to bol jazyk so statickou typovou kontrolou všeobecne použiteľný, ktorý má efektivitu a prenositeľnosť jazyka C.
- C++ je navrhnutý tak, aby priamo a vyčerpávajúco podporoval niekoľko štýlov programovania (procedurálne programovanie, dátovú abstrakciu, objektovo-orientované programovanie a generické programovanie).
- C++ je navrhnutý tak, aby dal programátorovi na výber. Dokonca mu umožňuje rozhodnúť sa nesprávne.
- C++ je navrhnutý tak, aby bol kompatibilný s jazykom C, tak ako je to možné. Preto je možný hladký prechod z jazyka C.
- C++ sa vyhýba č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 navrhnutý 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ť výrazy jazyka C++ na pamäťový model. Dodávatelia kompilátora nie sú obmedzovaní akým spôsobom implementujú štandard. Lippman pracoval na implementácii a údržbe Cfront-u – prvotnej implementácie C++ v Bell Labs.
Štandardná knižnica
Š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žnicou dokonca môžu byť napísané aj v jazyku C.
Štandardná knižnica jazyka C++ zahŕňa štandardnú knižnicu jazyka C s niekoľkými malými ú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ťazený zoznam), iterátory (zovšeobecnené ukazovatele). Tieto kontajnery poskytujú podobný 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ľným 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äť štandardných hlavičkových 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 štýle 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 ostatných č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čnými cieľmi návrhu.
Vlastnosti, ktoré priniesol jazyk C++
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šetkými 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 výnimiek, RTTI.
V rozpore s populárnou domnienkou, jazyk C++ nezaviedol kľúčové slovo const
ako prvý. Const bolo formálne pridané do jazyka C krátko predtým ako ho prevzalo C++.
C++ tiež v niektorých 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
, jednoriadkový 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 novými rozšíreniami, ktoré v C++ neexistujú, napríklad makro s premenným počtom parametrov, alebo polia s dĺžkou známou až za behu. Niektoré kompilátory môžu implementovať časť týchto rozšírení, ale niektoré rozšírenia neumožňujú kompatibilitu s C++.
Veľmi častým zdrojom nedorozumenia býva 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 význam vo väčšine ostatných objektovo orientovaných 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, ktorý využíva streamy zo štandardnej knižnice na zápis správy na štandardný výstup.
#include <iostream>
int main()
{
std::cout << "Hello, world!\n";
}
Operátory a preťaženie operátorov
C++ poskytuje viac ako 30 operátorov používaných 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 výnimiek (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 mnohých 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ť ignorovaný).
Šablóny
Š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 inými šablónami. Šablóny sú implementované pomocou „inštancií“ vytváraných 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ú mocným nástrojom, ktorý 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ónových parametrov sa vytvára ďalšia kópia kódu. Toto je rozdiel voči generovaniu za behu, ktorý môžeme vidieť v iných 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ť podmienený 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 statický polymorfizmus a generické programovanie. V skratke, šablóny sú pri preklade parametrizovateľné funkcie, alebo triedy napísané bez znalosti typových argumentov použitých pri ich inštancovaní. Po inštancovaní je výsledný kód rovnaký ako kód napísaný s dosadením šablónových parametrov. Takto šablóny poskytujú spôsob na oddelenie generických aspektov funkcií a tried od špecifických aspektov (uložených v šablónových parametroch) bez obetovania výkonnosti kvôli abstrakcii.
Úvod
Výhodou 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 objektových jazykov najefektívnejší (samozrejme v rukách skúseného programátora).
Zabalenie funkcionality (enkapsulácia)
V C alebo asembleri treba na naštartovanie nejakej funcionality 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, ktorý toto všetko sprehľadní a pekne čisto zabalí, takže hlavne pri opakovanom použití výrazne 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
#include<iostream> // zahrnutie prudu, ktorý umožňuje základne // vstupné a výstupné operácie int main () { int a, b; // deklarácia premenných 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 výsledok vypíše na štandardný výstup. 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 premenných a
a b
. Nakoniec sa vypíše hodnota premennej result
.
Výstup programu: 5
Referencie
- Bjarne Stroustrup's FAQ - When was C++ invented? [online]. [Cit. 2006-05-30]. Dostupné online.