Was sind die grundlegenden Unterschiede zwischen C und C ++? [geschlossen]

41

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

Aber was sind eigentlich 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?

gablin
quelle
2
Ich dachte , C ++ ist super von C eingestellt
Benutzer
1
C ++ ist nicht verbessert ... es ist eine Obermenge von C ..
Joe DF
2
@JoeDF Es war am Anfang, aber es ist jetzt "kompatibel mit C", was nicht das Gleiche bedeutet. Sie codieren nicht in C in C ++ und nicht jedes Standard-C ist mit Standard-C ++ kompatibel.
Fordern Sie den
+1 Sie haben Recht, es gibt jetzt wie Brüder oder Cousins. Wenn du weißt, was ich meine.
Joe DF

Antworten:

43

Die folgenden Punkte beziehen sich auf C ++:

  1. (benutzerdefiniertes) statisches Typensystem: Ermöglicht statische Überprüfungen Ihrer Daten und ihrer Verwendung - weist auf viele leicht zu behebende 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 (falsch benannt): Sie müssen nicht immer den Speicher verwalten. Behalten Sie einfach den Überblick und verwenden Sie intelligente Zeiger, die die Lebensdauer Ihrer Objekte beschreiben. Kann 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 Typensystem (siehe Konzepte in zukünftigen C ++ - Standards).
  6. Überladungen von Operatoren: Ermöglicht es, Operationen auf einfache syntaktische Weise zu beschreiben und sogar eingebettete domänenspezifische Sprachen in Ihrem C ++ - Code zu definieren.
  7. Namen mit Gültigkeitsbereich: Namespaces, Klassen / Strukturen, Funktionen usw. haben einfache Regeln, um sicherzustellen, dass Namen nicht in Konflikt geraten .
  8. Ausnahmesystem: Eine Methode zur Weitergabe von Fehlern, die häufig besser ist als der Rückkehrcode. Tatsächlich ist der Rückkehrcode gut für domänenspezifische logische Fehler, da die Anwendung diesen verwalten muss. Ausnahmen werden für "harte" Fehler verwendet, die den folgenden Code nur falsch machen. Dies ermöglicht es, Fehler zu erkennen, die höher im Aufrufstapel liegen, auf solche Ausnahmen zu reagieren (durch Protokollierung oder Behebung des Zustands) und bei guter Verwendung mit RAII das gesamte Programm nicht falsch zu machen - wenn dies wieder gut gemacht wird.
  9. Die Standardbibliothek: C hat eine eigene, aber es ist alles "dynamisch". Die C ++ - Standardbibliothek besteht fast ausschließlich aus Vorlagen (Containern und Algorithmen) (keine E / A-Streams), mit denen Code nur für das generiert werden kann, was Sie verwenden. Besser: Da der Compiler Code generieren muss, weiß er viel über den Kontext Bescheid und führt gerne viele Optimierungen durch, ohne dass der Codierer seinen Code verschleiern muss - dank Vorlagen und anderen Dingen.
  10. const-correctness: Der beste Weg, um sicherzustellen, dass Sie keine Variablen ändern, die Sie nicht sollten. Ermöglicht den schreibgeschützten Zugriff auf Variablen. Und es wird nur zur Kompilierungszeit überprüft, sodass keine Laufzeitkosten anfallen.
Klaim
quelle
31

C ++ wurde erfunden, um die Komplexität zu verwalten, die C nicht bewältigen konnte. Ein häufig auftretendes Problem bei C war beispielsweise, dass Ihnen "die Namen für Variablen ausgehen" (was natürlich nicht wörtlich genommen werden darf), da es keine Kapselung, Namespaces usw. gab.

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

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

Schließlich bietet OOP eine Reihe weiterer Vorteile, z. B. die Wiederverwendung von Objekten sowie generische programmierbasierte Konzepte wie Vorlagen und Generika, mit denen Sie Quellcode usw. Wiederverwenden können.

Und viele andere Dinge, die zu viel Zeit in Anspruch nehmen würden, um sie hier aufzulisten.

Jas
quelle
Mir gefällt, dass Sie über C ++ - Konstruktoren und C-Strukturen schreiben und dass diese fehleranfällig sind. Ich stimme dem zu. Aber ich mag die Java-Methode in JavaBeans nicht, bei der immer ein leerer Konstruktor verwendet wird und dann die Mitgliedsfelder mit Setters gesetzt werden. Das ist aus meiner Sicht genauso fehleranfällig wie C-Strukturen. Ich würde es vorziehen, meine Java-Objekte nur mit dem Konstruktor zu setzen. Siehe meine Frage zu StackOverflow dazu.
Jonas
Sie haben einen Punkt dort, aber der Fokus meiner Antwort hier war C gegen C ++.
Jas
1
Oh, komm schon, wer hindert dich daran, OOP mit C zu benutzen? Sie können Objekte wiederverwenden und alles tun, auch Ausnahmen. Es gibt sogar ein Buch darüber, das OOP-Programmierung in C heißt.
2
@Vlad, vor 25 Jahren war nichts von dem, worüber Sie sprechen, eine Option.
Jas
4
Sie können OOP in fast jeder Programmiersprache ausführen, die noch verwendet wird, dies bedeutet jedoch nicht, dass die Sprache dafür entwickelt wurde. Nehmen wir zum Beispiel Lua. Obwohl es technisch gesehen OOP erlaubt, scheint es ungefähr fünfzig verschiedene Möglichkeiten zu geben, was zu vielen Kopfschmerzen führt.
Tyjkenn
15

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

Einfach ausgedrückt ist C ++ objektorientiert (zum Beispiel haben Sie Klassen), C dagegen nicht.

C ++ hat einen Booleschen Typ, C89 nicht.

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

Federico Klez Culloca
quelle
4
C99 hat einen Booleschen Typ (benannt _Boolmit boolals Alias).
Jerry Coffin
1
Das ist nicht ganz richtig. Zum Beispiel hat C99 den long longDatentyp, der (noch) nicht Teil von ISO C ++ ist.
Chinmay Kanchi
11
Err ... C ++ ist nicht nur objektorientiert: Sie können objektorientierte Paradigmen mit C ++ verwenden, da die Sprache Funktionen dafür bereitstellt, sondern auch Funktionen für andere Paradigmen. Das solltest du erwähnen, es ist wirklich wichtig, es ändert alles. Wenn nicht, hätten wir alle auf Java
umgestellt
4
In C gibt es viele Konstrukte, die in C ++ nicht funktionieren.
1
@klez: ja - aber es ist immer noch falsch. Während ANSI ursprünglich C89 entwickelt hat (das keinen Booleschen Typ hatte), wird die Neuentwicklung jetzt von ISO durchgeführt, und ANSI akzeptiert den ISO-Standard, sodass der aktuelle ANSI-C-Standard mit dem aktuellen ISO-C-Standard identisch ist (der hat) ein Boolescher Typ).
Jerry Coffin
8

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

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

Grundsätzlich unterstützt C die strukturierte prozedurale Programmierung. C ++ unterstützt dies ebenso wie objektorientiertes Programmieren, generisches Programmieren und Metaprogrammieren (Ausführen einer beliebigen Berechnung zur Kompilierungszeit). Mit C ++ 11 werden einige Elemente hinzugefügt, die zumindest für die Unterstützung der funktionalen Programmierung gehalten werden könnten (z. B. Lambda-Ausdrücke). C ++ 14 hat ein paar mehr hinzugefügt, aber die meisten von ihnen sind wirklich komfortabler als jede größere Änderung der Ausrichtung.

Jerry Sarg
quelle
1

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

zvrba
quelle
1
Äh, wie wäre es mit Klassen mit Vererbung? Das ist wirklich harte Arbeit in C, während viele Vorlagen mit Präprozessor-Makros erstellt werden können.
JBRWilkinson
4
Präprozessor-Makros sind nicht typsicher. Es ist reine Textsubstitution, was auch das Debuggen erschwert. Grundlegende Klassen und Vererbung zum Laufen zu bringen, ist in C. + nicht viel Arbeit. Sie müssen Ihr eigenes Metaobjektmodell erstellen, anstatt sich an das zu halten, was der Sprachdesigner für Sie ausgewählt hat. Siehe zum Beispiel dieses Papier: arxiv.org/abs/1003.2547
zvrba
2
Mein Votum wäre Destruktoren für das wichtigste Merkmal, das C ++ gegenüber C hat (sogar gegenüber Konstruktoren wegen ihrer erstaunlichen Bereinigungsfähigkeiten).
Thomas Eding
@zvrba #define GENERATE_INTERFACE(T) T T##_func(T x);; (Typ) sicheres Überladen / Templates in C. Ich stimme Thomas zu, dass Destruktoren ein weitaus wichtigeres Merkmal sind, das in C fehlt. Destruktoren verbergen jedoch häufig wichtigen Code. Namespaces (Scope) sind meiner Meinung nach die wichtigsten.
YoYoYonnY