it-swarm-eu.dev

Jaké jsou základní rozdíly mezi C a C ++?

Mnozí mají sklon psát „C/C++“, jako by to byla stejná věc. Ačkoli sdílejí mnoho podobností, zjevně nejsou stejné.

Ale jaké jsou vlastně základní rozdíly mezi C a C++? Je C++ vylepšenou verzí C, nebo existují funkce v C, které v C++ neexistují?

41
gablin

Následující body se týkají C++:

  1. (uživatelem definovaný) statický typ systému: umožňuje statické kontroly vašich dat a jejich použití - ukazuje mnoho snadno proveditelných chyb v C.
  2. multi- "paradigma": umožňuje pracovat jako v C, s objektově orientovanými paradigmy, s generickými paradigmy atd.
  3. Constructor/Destructor: jediný způsob, jak jednou říct, co dělat při vytváření nebo ničení něčeho a být jisti, že uživatel nebude muset najít správnou funkci a používat ji jako v C.
  4. RAII (špatně pojmenované): nemusíte vždy spravovat paměť. Prostě mějte na paměti a používejte inteligentní ukazatele popisující životnost vašich objektů. Stále lze použít surové ukazatele.
  5. Šablony: lepší než makro, skutečný jazyk pro manipulaci a generování typů před konečnou kompilací. Chybí pouze typový systém (viz Koncepty v budoucích standardech C++).
  6. Operátor přetížení: umožňuje popsat operace jednoduchým syntaktickým způsobem a dokonce definovat vestavěné jazyky specifické pro doménu uvnitř vašeho kódu C++.
  7. Scoped names: jmenné prostory, třídy/struktura, funkce atd. Mají jednoduchá pravidla, aby se zajistilo, že se jména nebudou střetávat.
  8. Výjimkový systém: způsob šíření chyb, který je často lepší než návratový kód. Návratový kód je ve skutečnosti vhodný pro logické chyby specifické pro doménu, protože jej musí aplikace spravovat. Výjimky se používají pro „tvrdé“ chyby, které způsobují, že následující kód je právě nesprávný. Umožňuje zachytit chyby vyšší v zásobníku volání, je-li to možné, reagovat na takovou výjimku (protokolováním nebo opravou stavu) a pomocí RAII, pokud je dobře použit, nezpůsobí špatný celý program - pokud bude dobře, znovu.
  9. Standardní knihovna: C má své vlastní, ale je to všechno „dynamické“. Standardní knihovna C++ je téměř (nikoli IO proudy) vyrobena ze šablon (kontejnery a algoritmy), které umožňují generování kódu pouze pro to, co používáte. Lepší: protože kompilátor musí generovat kód, bude vědí hodně o kontextu a budou šťastně aplikovat spoustu optimalizací, aniž by museli vyžadovat, aby kódovač zahalil svůj kód - díky šablonám a dalším věcem.
  10. const-správnost: Nejlepší způsob, jak zajistit, že neměníte proměnné, které byste neměli. Umožňuje určit přístup k proměnným pouze pro čtení. A je kontrolována pouze v době kompilace, takže nevznikají žádné náklady na běh.
43
Klaim

C++ byl vynalezen za účelem zvládnutí složitosti, kterou C nedokázal zvládnout. Například běžným problémem s C bylo to, že byste mohli „docházet jména pro proměnné“ (samozřejmě to nelze brát doslova), protože nedošlo k zapouzdření, jmenným prostorům atd.

C také nemá výjimky, proto je zpracování chyb velmi náchylné k chybám, protože záleží na uživateli knihovny, aby vždy zkontroloval návratové hodnoty funkcí, zatímco s výjimkami vyvolává vývojář knihovny výjimku, která zaručuje zastavení toku programu.

C++ pomáhá tím, že má konstrukční iniciační objekty, které jsou automaticky vyvolávány kompilátorem. Na rozdíl od struktur C, které je třeba inicializovat programátorem (tedy další oblast náchylná k chybám).

A konečně existuje mnoho dalších výhod, které OOP nabízí, jako je opětovné použití objektu, jakož i obecné koncepty založené na programování, jako jsou šablony a generika, které vám umožní znovu použít zdrojový kód atd.

31
Jas

Obecně je vše, co existuje v C, podporováno v C++. Je zřejmé, že opak je naprosto nepravdivý.

Jednoduše řečeno, C++ je objektově orientovaný (takže například máte třídy), C není.

C++ má booleovský typ C89 ne.

Jsou to různé jazyky. Prostě sdílejí většinu syntaxe.

15

C99 má několik funkcí, které v C++ neexistují (alespoň ve stejném tvaru) (např. Flexibilní členy pole, pole s proměnnou délkou atd.)

C99 také hodně přidal do knihovny, která není přítomna ve standardu C++ 98/03; většina z toho však byla přidána do C++ 11.

Pokud jde o základní orientaci, C v podstatě podporuje strukturované procedurální programování. C++ to podporuje, stejně jako objektově orientované programování, obecné programování a metaprogramování (provádění libovolného výpočtu v době kompilace). S C++ 11 přidává několik bitů a kousků, které by se mohly alespoň zaměnit za funkční podporu programování (např. Lambda výrazy). C++ 14 přidal několik dalších, ale většina z nich je opravdu mnohem pohodlnější než jakákoli velká změna orientace.

8
Jerry Coffin

Osobně si myslím, že šablony jsou nejvýznamnější funkcí, kterou C++ přidává do C.

1
zvrba