Prechod od C k C ++
Jazyky C a C ++ sú si veľmi blízke. Môže nás až prekvapiť, že každý program, ktorý možno skompilovať pomocou C kompileru možno súčasne skompilovať aj pomocou C ++ kompileru. Avšak je tu niekoľko vecí, ktoré sa v C ++ píšu inak. Možno vás teraz napadne, že si vlastne protiřečím. Keď sa niečo píše inak, nemôže to byť predsa kompatibilné. V skutočnosti jazyk C ++ spätne podporuje jazyk C a ako si povieme, poskytuje len ďalšie syntax pre uľahčenie práce.
Kompatibilita
V úvode som spomenul, že každý program, ktorý možno skompilovať C kompilerem, je aj validný C ++ program. Aby sme tvrdenie spresnili, povedzme si, že C ++ zakazuje niekoľko málo (a presne popísaných) prípadov, ktoré kompilátor C povoľuje. Nemusíte sa ale desiť. Vývojári C ++ sa k tomuto kroku uchýlili, pretože C podporuje operácie, ktorých výsledok nie je na prvý pohľad úplne zrejmý. Píšete Ak program slušne, nemusíte sa ničoho báť. Pre úplnosť iba v bodoch vypíšem rozdiely, teda konštrukcie, ktoré v C ++ nie sú povolené, ale v C fungujú bez problémov.
- Implicitné konverzie z ukazovateľa typu void na ľubovoľný iný ukazovateľ.
void* ptr; int* num = ptr;
- Nové kľúčové slová jazyka C ++ (template, new, delete, class a ďalšie)
- Zákaz príkazu goto alebo switch na preskočenie deklarácie premenné.
goto navesti; int variable; navesti: //zbytek programu
- Opakovaná deklarácia globálne premenné.
- U funkcie, ktorá neprijíma žiaden parameter, sa muselo uvádzať do parametra void. Ak nebolo uvedené, C predpokladalo, že počet parametrov je premenlivý. V C ++ sa void uvádzať nemusia a funkcia nesmie prijímať žiadny parameter.
- Konštantné hodnoty berie C ++ striktnejšie než C.
- Standard C99 a C11 pridal do C niekoľko vecí, ktoré nie sú v štandarde C ++. To ale neznamená, že je kompilery nepodporujú!
Prečo sme sa vlastne učili C?
V prvom rade je C vhodnejšie na systémové programovanie. C ++ dovoľuje preťaženie metód. Téma bude prebrané v sérii o C ++, ale v skratke sa jedná o to, že môžeme mať niekoľko funkcií s rovnakým názvom, ale rôznymi parametrami. Menšie príklad:
int secti(int scitanec) { return scitanec+scitanec; } int secti(int prvniScitanec, int druhyScitanec) { return prvniScitanec+druhyScitanec; }
Aby kompiler funkcie medzi sebou rozpoznal, vykonáva tzv. Name mangling. Interne pridá rôzne predpony na základe hlavičky funkcie. To znamená, že nepoznáme skutočné meno funkcie až do doby, než kompiler k funkcii dôjde. C name mangling nerobí a tak môžeme napríklad z assembleri volať priamo C funkcie. Je tu ale ešte jedna vec, ktorá je oveľa dôležitejšia.
Pretože sú si jazyky tak podobné, väčšina knižníc je napísaná pre C. Je to pochopiteľné, prečo by sme mali písať tú rovnakú knižnicu 2x - raz pre C a raz pre C ++, keď môžeme vziať knižnicu z C a bez problémov ju použiť v C ++. Céčko teda bohato využijete aj v C ++.
Práve z tohto dôvodu odporúčam naučiť sa najskôr C a následne prejsť na C ++. To hovorím ako niekto, kto už v C ++ robí niekoľko rokov. Prechod z C na C ++ je úplne bezproblémový. Všetky zmeny, ktoré sú v C ++, popíšem práve v tomto článku.
Ako teda začať s C ++?
Najskôr budeme potrebovať IDE pre vývoj. Buďto môžete pokračovať s NetBeans alebo si môžete stiahnuť Visual Studio (odporúčané) či Eclipse. Inštalácia Visual Studia je popísaná vo druhej lekcii kurzu základných konštrukcií C ++.
Ďalej si prečítajte zvyšok rozdielov, ktoré sa v C ++ vyskytujú. Niektoré témy odkazujú priamo na lekcie z kurzu programovania v C ++. Ide o témy, ktoré sa v C ++ zmenila viac a nezvládol by som ich tu opísať v pár odsekoch. Spomínané lekcie budú jediné potrebné materiály. Po ich prečítaní môžete preskočiť celé základy a prejsť rovno na objektovo orientovaného programovania v C ++.
Správa pamäte
C a C ++ má rozdielnu správu pamäte. Z céčka poznáme funkcie malloc () a free (). Malloc () nám alokovalo miesto na halde, zatiaľ čo free () pamäť uvoľnilo. C ++ zavádza nové kľúčové slová "new" a "delete", ktorá slúži na rovnaký účel. Hneď na úvod dôležité upozornenie: prístupy nemožno kombinovať !! Pamäť vytvorenú pomocou syntaxe C ++ (teda pomocou new) nedá uvoľniť volaním funkcie free (). Rovnako tak je tomu obrátene, pamäť získanú z funkcie malloc () nedá uvoľniť pomocou delete! Než aby som tu popisoval syntax a všetko okolo, presmerujem vás na diel priamo k tomu určený. Najskôr je to článok Dynamická správa pamäte v C ++. Obsahom kopíruje obsah rovnakého článku v C, ale používa už novú syntax pre alokovanie prostriedkov. Ďalej C ++ zavádza nový "typ" - referenciu. Ten je prebraný v článku Referencie v C ++.
Vstup a výstup
C ++ používa pre vstup a výstup objekty. Že zatiaľ neviete, čo to objekty sú, vôbec nevadí. Jednoducho si iba prečítajte prvý článok Hello World v C ++ a článok o validácii vstupov od užívateľa. Podrobnejší popis bude až po prebratí princípov OOP.
Možnosti funkcií
C ++ má na rozdiel od C väčšie možnosti, ako môže s funkciami pracovať. Môžeme mať napríklad viac funkcií s rovnakým názvom ale inými parametrami. Kompilátor si potom sám vyberie, ktorá funkcia sa k parametrom najviac hodí. Týmto zmenám je venovaný celý diel preťažovaniu a statika u funkcií
Práca s reťazcami
Pre text má C ++ samostatný typ: string. Môže obsahovať text ľubovoľnej dĺžky. Spájanie prebieha prirodzene pomocou znamienka +. Nenechajte sa ale zmiasť, opäť sa jedná len o objekt, ktorý interne dynamicky spravuje pole char, tak ako to poznáme z jazyka C. Opäť len presmerujem na diel Reťazca v C ++.
Definícia štruktúr
VC sme písali u štruktúr konštrukciu typedef. Tým sme zaistili, že nemusíme v kóde opakovane písať informáciu, že sa jedná o štruktúru. C ++ pridáva typedef implicitne, stačí teda uviesť len meno štruktúry. Tá rovnaké pravidlá platia pre všetky výskyty typedef, ktoré sme v C používali (napríklad Enuma).
struct osoba { int vek; int vyska; } int main() { osoba karel; //..... }
Knižnice
V céčku sme prebrali veľké množstvo knižníc. Pozitívne informácií je, že ich môžeme bez problémov použiť aj v C ++. Ak budeme písať názvy knižníc rovnakým spôsobom, akým sme to písali do teraz, nič sa nedeje. Program bude fungovať správne a kompiler s tým nebude mať najmenší problém. Avšak pre C ++ sa zavádza nové názvy, ktoré majú pred svojím názvom predponu "c" a je odstránená koncovka ".h". Ale ako som povedal, zmena nie je vyžadovaná a fungujú oba prístupy.
#include <stdlib.h> #include <cstdlib> // ekvivalentní zápis
Dopredná inicializácia premenných
V céčku je zvykom všetky premenné nadeklarovat na začiatku funkcie alebo bloku kódu. Správne by céčko ani nemalo povoliť nasledujúce zápis:
for(int i=0;....)
Podľa štandardov C by mala byť premenná aj nadefinované pred začiatkom for cyklu. V C ++ toto obmedzenie neplatí a premenné môžu byť deklarované kdekoľvek počas vykonávania bloku kódu. Samozrejme musí byť premenná stále deklarovaná pred jej použitím, inak prekladač zahlási chybu.
Tým sme ukončili tento krátky článok, ktorý sa zaoberal rozdiely medzi C a C ++. Teraz môžete preskočiť rovno na OOP v C ++.