Přechod od C k C++

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

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

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 zde několik věcí, které se v C++ píší jinak. Možná vás nyní napadne, že si vlastně protiřečím. Když se něco píše jinak, nemůže to být přeci kompatibilní. Ve skutečnosti jazyk C++ zpětně podporuje jazyk C a jak si řekneme, poskytuje pouze další syntaxi pro ulehčení práce.

Kompatibilita

V úvodu jsem zmínil, že každý program, který lze zkompilovat C kompilerem, je i validní C++ program. Abychom tvrzení upřesnili, řekněme si, že C++ zakazuje několik málo (a přesně popsaných) případů, které kompilátor C povoluje. 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 ničeho bát. Pro úplnost pouze v bodech vypíšu rozdíly, tedy konstrukce, které v C++ nejsou povoleny, 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 navesti;
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éma 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 dojde. 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, která je 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 i v C++.

Právě z tohoto důvodu doporučuji naučit se nejdříve C a následně přejít na C++. To říkám jako někdo, kdo již v C++ dělá několik let. Přechod z C na C++ je naprosto bezproblémový. 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ďto můžete pokračovat s NetBeans nebo si můžete stáhnout Visual Studio (doporučeno) či Eclipse. Instalace Visual Studia je popsána ve druhé lekci kurzu základních konstrukcí C++.

Dále si přečtěte zbytek rozdílů, které se v C++ vyskytují. Některá témata odkazují přímo na lekce z kurzu programování v C++. Jedná se o témata, která se v C++ změnila více a nezvládl bych je zde popsat v pár odstavcích. Zmíněné lekce budou jediné potřebné materiály. Po jejich přečtení můžete přeskočit celé základy a přejít rovnou na objektově orientovaného programování v C++.

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 uvolnit voláním funkce free(). Stejně tak je tomu obráceně, paměť získanou 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 v C++ 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 jedná pouze o objekt, který interně dynamicky spravuje pole charů, tak jak to známe z jazyka 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 v kódu opakovaně psát informaci, že se jedná o strukturu. C++ přidává typedef implicitně, stačí tedy uvést pouze jméno struktury. Ta 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 jsem ř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 céčko ani nemělo 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 proměnná stále 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++.