Přechod od C k C++

C++ Přechod od C k C++

Jazyky C a C++ jsou si velmi blízké. Může nás až překvapit, že každý program, který lze zkompilovat pomocí C kompileru lze současně zkompilovat i pomocí C++ kompileru. Nicméně je několik změn, které se v C++ píší jinak. Možná vás teď napadne, že si vlastně protiřečím. Když se něco píše jinak, nemůže to být přece kompatibilní. Ve skutečnosti jazyk C++ zpětně C podporuje a jak si v řekneme, jedná se pouze o speciální případ použití, kterým jsme si v C zlehčovali práci.

Kompatibilita

V úvodu jsem řekl, že každý program, který lze zkompilovat C kompilerem je i validní C++ program. To není tak úplně pravda. C++ zakazuje několik málo (a přesně popsaných) případů, které kompilátor C povolí. Nemusíte se ale děsit. Vývojáři C++ se k tomuto kroku uchýlili, protože C podporuje operace, jejichž výsledek není na první pohled úplně zřejmý. Píšete-li program slušně, nemusíte se čeho bát. Pro úplnost pouze v bodech vypíšu rozdíly, které v C++ nejsou povolen, ale v C fungují bez problémů.

  • Implicitní konverze z ukazatele typu void na libovolný jiný ukazatel.
void* ptr;
int* num = ptr;
  • Nové klíčové slova jazyka C (template, new, delete, class a další)
  • Zákaz příkazu goto nebo switch na přeskočení deklarace proměnné.
goto navest;
int variable;
navesti:
//zbytek programu
  • Opakovaná deklarace globální proměnné.
  • U funkce, která nepřijímá žádný parametr, se muselo uvádět do parametru void. Nebylo-li uvedeno, C předpokládalo, že počet parametrů je proměnlivý. V C++ se void uvádět nemusí a funkce nesmí přijímat žádný parametr.
  • Konstantní hodnoty bere C++ striktněji než C.
  • Standard C99 a C11 přidal do C několik věcí, které nejsou ve standardu C++. To ale neznamená, že je kompilery nepodporují!

Proč jsme se vlastně učili C?

V první řadě je C vhodnější na systémové programování. C++ dovoluje přetížení metod. Témat bude probráno v sérii o C++, ale ve zkratce se jedná o to, že můžeme mít několik funkcí se stejným názvem, ale různými parametry. Menší příklad:

int secti(int scitanec)
{
     return scitanec+scitanec;
}
int secti(int prvniScitanec, int druhyScitanec)
{
     return prvniScitanec+druhyScitanec;
}

Aby kompiler funkce mezi sebou rozpoznal, provádí tzv. name mangling. Interně přidá různé předpony na základě hlavičky funkce. To znamená, že neznáme skutečné jméno funkce až do doby, než kompiler k funkci příjde. C name mangling nedělá a tak můžeme například z assembleru volat přímo C funkce. Je tu ale ještě jedna věc, mnohem důležitější.

Protože jsou si jazyky tak podobné, většina knihoven je napsána pro C. Je to pochopitelné, proč bychom měli psát tu stejnou knihovnu 2x - jednou pro C a jednou pro C++, když můžeme vzít knihovnu z C a bez problémů ji použít v C++. Céčko tedy bohatě využijete využijete i v C++.

Právě z tohoto důvodu doporučuji nejdříve se naučit C a následně přejít na C++. To říkám jako někdo, kdo už v C++ dělá několik let. Přechod z C na C++ je naprosto bez problémů. Všechny změny, které jsou v C++ popíši právě v tomto článku.

Jak tedy začít s C++?

Nejdříve budeme potřebovat IDE pro vývoj. Buď můžete pokračovat s NetBeans, a nebo si můžete stáhnout Visual Studio či Eclipse. Instalace Visual Studio je popsána ve druhém článku v sérii o základu C++.

Dále si přečtěte zbytek rozdílů, které se v C++ vyskytují. Některé témata mají odkaz na díly ze série programování v C++. Jedná se o témata, které se v C++ změnili více a nezvládl bych je popsat tady v pár odstavcích. Zmíněné díly budou jediné potřebné materiály. Po jejich přečtení můžete přeskočit celé základy a jít rovnou na objektově orientované programování.

Správa paměti

C a C++ má rozdílnou správu paměti. Z céčka známe funkce malloc a free. Malloc nám alokovalo místo na haldě, zatímco free paměť uvolnilo. C++ zavádí nová klíčové slova "new" a "delete", které slouží ke stejnému účelu. Hned na úvod důležité upozornění: přístupy nelze kombinovat!! Paměť vytvořenou pomocí syntaxe C++ (tedy pomocí new) nelze odstranit voláním funkce free. Stejně tak je tomu obráceně, paměť získána z funkce malloc nelze uvolnit pomocí delete! Než abych zde popisoval syntaxi a vše okolo, přesměruji vás na díl přímo k tomu určený. Nejdříve je to článek Dynamická správa paměti v C++. Obsahem kopíruje obsah stejného článku v C, ale používá již novou syntaxi pro alokování prostředků. Dále C++ zavádí nový "typ" - referenci. Ten je probrán v článku Reference v C++.

Vstup a výstup

C++ používá pro vstup a výstup objekty. Že zatím nevíte, co to objekty jsou vůbec nevadí. Jednoduše si pouze pročtěte první článek Hello World a článek o validaci vstupů od uživatele. Podrobnější popis bude až po probrání principů OOP.

Práce s řetězci

Pro text má C++ samostatný typ: string. Může obsahovat text libovolné délky. Spojování probíhá přirozeně pomocí znaménka +. Nenechte se ale zmást, opět se pouze jedná o objekt, který interně dynamicky spravuje pole charů, tak jak to známe z C. Opět pouze přesměruji na díl Řetězce v C++.

Definice struktur

V C jsme psali u struktur konstrukci typedef. Tím jsme zajistili, že nemusíme opakovaně v kódu psát informaci, že se jedná o strukturu. C++ přidává typedef implicitně, stačí tedy uvést pouze jméno struktury. Ty stejná pravidla platí pro všechny výskyty typedef, které jsme v C používali (například enumy).

struct osoba
{
        int vek;
        int vyska;
}
int main()
{
        osoba karel;
        //.....
}

Knihovny

V céčku jsme probrali velké množství knihoven. Pozitivní informací je, že je můžeme bez problémů použít i v C++. Pokud budeme psát názvy knihoven stejným způsobem, jakým jsme to psali do teď, nic se neděje. Program bude fungovat správně a kompiler s tím nebude mít nejmenší problém. Nicméně pro C++ se zavádí nové názvy, které mají před svým názvem předponu "c" a je odstraněna koncovka ".h". Ale jak jsme řekl, změna není vyžadována a fungují oba přístupy.

#include <stdlib.h>
#include <cstdlib> //ekvivalentní zápis

Dopředná inicializace proměnných

V céčku je zvykem všechny proměnné nadeklarovat na začátku funkce nebo bloku kódu. Správně by nemělo céčko povolit následující zápis.

for(int i=0;....)

Podle standardů C by měla být proměnná i nadefinovaná před začátkem for cyklu. V C++ toto omezení neplatí a proměnné mohou být deklarovány kdekoliv během provádění bloku kódu. Samozřejmě musí být stále proměnná deklarována před jejím použitím, jinak překladač zahlásí chybu.

Tím jsme ukončili tento krátký článek, který se zabýval rozdíly mezi C a C++. Nyní můžete přeskočit rovnou na OOP v C++.