it-swarm.dev

Was sind die grundlegenden Unterschiede zwischen C und C ++?

Viele neigen dazu, "C/C++" zu schreiben, als ob sie dasselbe wären. Obwohl sie viele Gemeinsamkeiten aufweisen, sind sie eindeutig nicht gleich.

Aber was sind wirklich die grundlegenden Unterschiede zwischen C und C++? Ist C++ eine erweiterte Version von C oder gibt es Funktionen in C, die in C++ nicht vorhanden sind?

41
gablin

Die folgenden Punkte beziehen sich auf C++:

  1. (benutzerdefiniertes) statisches Typsystem : ermöglicht statische Überprüfungen Ihrer Daten und deren Verwendung - weist auf viele leicht zu befolgende Fehler in C hin.
  2. Multi- "Paradigma" : ermöglicht das Arbeiten wie in C, mit objektorientierten Paradigmen, mit generischen Paradigmen usw.
  3. Konstruktor/Destruktor : die einzige Möglichkeit, einmal zu sagen, was zu tun ist, wenn etwas erstellt oder zerstört wird, und sicherzustellen, dass der Benutzer nicht die richtige Funktion finden und wie in C verwenden muss.
  4. RAII (schlecht benannt) : Sie müssen nicht immer den Speicher verwalten. Behalten Sie einfach den Umfang bei und verwenden Sie intelligente Zeiger, die die Lebensdauer Ihrer Objekte beschreiben. Kann immer noch rohe Zeiger verwenden.
  5. Vorlagen : besser als Makro, eine echte Sprache zum Bearbeiten und Generieren von Typen vor der endgültigen Kompilierung. Es fehlt nur ein Typsystem (siehe Konzepte in zukünftigen C++ - Standards).
  6. Operatorüberladungen : ermöglicht es, Operationen auf einfache syntaktische Weise zu beschreiben und sogar eingebettete domänenspezifische Sprachen in Ihrem C++ - Code zu definieren.
  7. Gültigkeitsbereichsnamen : Namespaces, Klassen/Strukturen, Funktionen usw. haben einfache Regeln, um sicherzustellen, dass Namen nicht in Konflikt geraten.
  8. Ausnahmesystem : eine Möglichkeit, Fehler zu verbreiten, die oft besser ist als der Rückkehrcode. In der Tat ist der Rückkehrcode gut für domänenspezifische logische Fehler, da die Anwendung ihn verwalten muss. Ausnahmen werden für "harte" Fehler verwendet, die den folgenden Code einfach falsch machen. Es ermöglicht es, Fehler höher im Aufrufstapel abzufangen, wenn möglich, auf eine solche Ausnahme zu reagieren (durch Protokollieren oder durch Beheben des Status) und mit RAII, wenn es gut verwendet wird, macht es nicht das gesamte Programm falsch - wenn es wieder gut gemacht wird.
  9. Die Standardbibliothek : C hat eine eigene, aber alles ist "dynamisch". Die C++ - Standardbibliothek besteht fast (nicht IO Streams) aus Vorlagen (Containern und Algorithmen), mit denen Code nur für das generiert werden kann, was Sie verwenden. Besser: Der Compiler muss Code generieren Sie wissen viel über den Kontext und werden glücklicherweise viele Optimierungen anwenden, ohne dass der Codierer seinen Code verschleiern muss - dank Vorlagen und anderen Dingen.
  10. const -rectness : Der beste Weg, um sicherzustellen, dass Sie keine Variablen ändern, die Sie nicht ändern sollten. Ermöglicht die Angabe des schreibgeschützten Zugriffs auf Variablen. Und es wird nur zur Kompilierungszeit überprüft, sodass keine Laufzeitkosten anfallen.
43
Klaim

C++ wurde erfunden, um die Komplexität zu verwalten, die C nicht bewältigen konnte. Ein häufiges Problem bei C war beispielsweise, dass Ihnen "die Namen für Variablen ausgehen" (natürlich nicht wörtlich zu verstehen), da keine Kapselung, Namespaces usw. vorhanden waren.

Außerdem hat C keine Ausnahmen, daher ist die Fehlerbehandlung sehr fehleranfällig, da es vom Bibliotheksbenutzer abhängt, immer die Rückgabewerte von Funktionen zu überprüfen, während der Bibliotheksentwickler mit Ausnahmen einfach eine Ausnahme auslöst, die garantiert, dass der Programmfluss gestoppt wird.

C++ hilft, indem es die Konstruktor-Init-Objekte hat, die vom Compiler automatisch aufgerufen werden. Im Gegensatz zu C-Strukturen, die vom Programmierer initialisiert werden müssen (daher ein weiterer fehleranfälliger Bereich).

Schließlich gibt es viele andere Vorteile, die von OOP angepriesen werden, wie die Wiederverwendung von Objekten sowie die generischen programmierbasierten Konzepte wie Vorlagen und Generika, mit denen Sie den Quellcode usw. Wiederverwenden können.

31
Jas

Im Allgemeinen wird alles, was in C vorhanden ist, in C++ unterstützt. Offensichtlich ist das Gegenteil absolut falsch.

Einfach gesagt, C++ ist objektorientiert (zum Beispiel haben Sie Klassen), C nicht.

C++ hat einen booleschen Typ, C89 nicht.

Sie sind verschiedene Sprachen. Sie teilen nur den größten Teil der Syntax.

15

C99 verfügt über einige Funktionen, die in C++ nicht vorhanden sind (zumindest nicht in genau derselben Form) (z. B. flexible Array-Elemente, Arrays variabler Länge usw.).

C99 hat der Bibliothek auch eine Menge hinzugefügt, die im Standard C++ 98/03 nicht vorhanden ist. Das meiste davon wurde jedoch zu C++ 11 hinzugefügt.

In Bezug auf die Grundorientierung unterstützt C grundsätzlich eine strukturierte prozedurale Programmierung. C++ unterstützt dies ebenso wie objektorientierte Programmierung, generische Programmierung und Metaprogrammierung (Durchführung beliebiger Berechnungen zur Kompilierungszeit). Mit C++ 11 werden einige Kleinigkeiten hinzugefügt, die zumindest auch für die Unterstützung der funktionalen Programmierung gehalten werden könnten (z. B. Lambda-Ausdrücke). C++ 14 hat einige weitere hinzugefügt, aber die meisten davon sind eher bequemer als jede größere Änderung der Ausrichtung.

8
Jerry Coffin

Persönlich denke ich, dass Vorlagen das wichtigste Merkmal sind, das C++ zu C hinzufügt.

1
zvrba