Ich habe gelesen, dass C ++ eine Supermenge von C ist und eine Echtzeit-Implementierung durch das Erstellen von Objekten bereitstellt. Auch C ++ ist der realen Welt verschlossen, da es mit objektorientierten Konzepten angereichert ist.
Was alle Konzepte gibt es in C ++, die nicht in C implementiert werden können?
printf()
haben?
Beispiel: printf("sachin");
druckt sachin
und printf("%d, %s",count ,name);
druckt 1,sachin
unter der Annahme, dass count eine Ganzzahl ist, deren Wert 1 ist, und name ein Zeichen-Array ist, das mit "sachin"
initialisiert wurde. Einige Responder hier argumentieren, dass die meisten Dinge, die mit C ++ - Code produziert werden können, auch mit C genug Ambitionen haben können. Dies ist in einigen Teilen richtig, aber einige Dinge sind von Natur aus unmöglich zu erreichen, wenn Sie den C-Compiler nicht vom Standard abweichen lassen.
Fälschbar:
Unmöglich:
Sehenswert:
Erläuterung zu RAII:
Dieses Konzept wird gewöhnlich falsch interpretiert, wenn es um seinen wichtigsten Aspekt geht: das implizite Ressourcenmanagement, d. h. das Konzept, dass (normalerweise auf Sprachenebene) gewährleistet wird, dass Ressourcen richtig gehandhabt werden. Einige glauben, dass das Erreichen von RAII dadurch erreicht werden kann, dass diese Verantwortung dem Programmierer überlassen wird (z. B. explizite Destruktoraufrufe bei Goto-Labels), was leider nicht annähernd die Sicherheitsprinzipien von RAII als Entwurfskonzept liefert.
Ein Zitat aus einem Wikipedia-Artikel, der diesen Aspekt von RAII verdeutlicht:
"Ressourcen müssen daher an die Lebensdauer geeigneter Objekte gebunden sein. Sie werden während der Initialisierung erfasst, wenn sie nicht genutzt werden können, bevor sie verfügbar sind, und mit der Zerstörung derselben Objekte freigegeben werden. was auch bei Fehlern garantiert ist .
Nun, wenn Sie keinen C ++ - Compiler mit C implementieren, gibt es Tausende von Dingen, die Sie mit C ++ tun können, aber nicht mit C. Um nur einige zu nennen:
Obwohl Sie die meisten oben in C emulieren können, müssen Sie sich auf Konventionen verlassen und die Arbeit manuell erledigen, während der C ++ - Compiler die Aufgabe für Sie übernimmt.
Es gibt nur ein printf()
in der C-Standardbibliothek. Andere Varianten werden implementiert, indem der Name geändert wird, z. B. sprintf()
, fprintf()
usw.
Strukturen können die Implementierung nicht verbergen, es gibt keine private
Daten in C. Natürlich können Sie Daten ausblenden, indem Sie z. Zeiger zeigen auf, wie es für FILE * von der Standardbibliothek getan wird. Es gibt also eine Datenabstraktion, aber nicht als direktes Merkmal des Konstrukts struct
.
Sie können auch keine Operatoren in C überladen, also bedeutet a + b
immer, dass irgendeine Art von Addition stattfindet. In C ++ kann, je nach Art der beteiligten Objekte, alles passieren.
Beachten Sie, dass dies (subtil) bedeutet, dass +
in C tatsächlich is
überschrieben ist; int + int
ist nicht derselbe Code wie zum Beispiel float + int
. Aber Sie können diese Art von Überschreibung nicht selbst durchführen, es ist nur etwas für den Compiler.
Es geht weniger darum, welche Funktionen nicht implementiert werden können, und mehr darüber, welche Funktionen direkt in der Sprache unterstützt werden und somit eine klare und prägnante Darstellung des Designs ermöglichen.
Sicher können Sie die meisten C ++ - Funktionen in C implementieren, simulieren, fälschen oder emulieren, aber der resultierende Code wird wahrscheinlich weniger lesbar oder wartbar sein. Sprachunterstützung für OOP-Funktionen ermöglicht, dass Code, der auf einem Objektorientierten Entwurf basiert, viel einfacher ausgedrückt werden kann als derselbe Entwurf in einer Nicht-OOP-Sprache. Wenn C Ihre Sprache der Wahl wäre, dann wäre OOD möglicherweise nicht die beste zu verwendende Entwurfsmethode - oder zumindest eine extensive Verwendung fortgeschrittener OOD-Idiome ist möglicherweise nicht ratsam.
Natürlich, wenn du kein Design hast, dann wirst du wahrscheinlich in jeder Sprache ein Durcheinander haben! ;)
printf verwendet eine Argumentliste mit variabler Länge, keine überladene Version der Funktion
C-Strukturen haben keine Konstruktoren und können nicht von anderen Strukturen erben. Sie sind einfach eine bequeme Methode, gruppierte Variablen zu adressieren
C ist keine OO-Sprache und hat keine Funktionen einer OO-Sprache
Nachdem Sie gesagt haben, dass Sie die C ++ - Funktionalität mit C-Code imitieren können, wird der Compiler mit C ++ die gesamte Arbeit für Sie in der Kompilierzeit erledigen
Was alle Konzepte in C ++ sind das kann nicht in C implementiert werden?
Das ist eine seltsame Frage, denn wirklich jedes Konzept, das in C ++ ausgedrückt werden kann, kann in C ausgedrückt werden. Selbst C ++ - ähnliche Templates können in C mit verschiedenen schreckliche Makro-Tricks und andere Verbrechen gegen die Menschlichkeit.
Der wirkliche Unterschied kommt auf zwei Dinge an: was der Compiler zustimmen wird und welche syntaktischen Vorteile die Sprache bietet.
In Bezug auf die Erzwingung des Compilers erlaubt Ihnen der Compiler in C ++ keinen direkten Zugriff auf private Datenmitglieder von außerhalb einer Klasse oder von Freunden der Klasse. In C wird der Compiler dies nicht erzwingen; Sie müssen sich auf die API-Dokumentation verlassen, um "private" Daten von "öffentlich zugänglichen" Daten zu trennen.
Und in Bezug auf die syntaktische Bequemlichkeit bietet C ++ alle Arten von Annehmlichkeiten, die in C nicht zu finden sind, wie Operatorüberladung, Referenzen, automatisierte Objektinitialisierung und -zerstörung (in Form von Konstruktoren / Destruktoren), Ausnahmen und automatisiertes Stackabwickeln, zur Unterstützung von Polymorphismus, etc.
Grundsätzlich kann jedes in C ++ ausgedrückte Konzept in C ausgedrückt werden; Es ist nur eine Frage, wie weit der Compiler gehen wird, um Ihnen zu helfen, ein bestimmtes Konzept auszudrücken und wie viel syntaktische Bequemlichkeit der Compiler bietet. Da C ++ eine neuere Sprache ist, gibt es viel mehr Schnickschnack als in C, was den Ausdruck bestimmter Konzepte erleichtert.
Sie können C ++ vollständig in C implementieren ... Der ursprüngliche C ++ - Compiler von AT + T war tatsächlich ein Präprozessor namens CFront, der C ++ - Code in C übersetzt und kompiliert hat.
Dieser Ansatz wird heute noch von comeau computing verwendet, die einen der mit C ++ - Standards kompatiblen Compiler erstellen dort ist, z. Es unterstützt alle C ++ - Funktionen.
Ein Feature, das nicht wirklich OOP-bezogen ist, sind die Standardargumente , die einen echten Schlüsselschoner darstellen können richtig verwendet.
Ich nehme an, es gibt so viele Namespaces, Templates, die nicht in C implementiert werden konnten.
Zitieren Joel , ich würde sagen, eine mächtige "Funktion" von C ++ ist das Überladen von Operatoren. Das bedeutet für mich, eine Sprache zu haben, die Sie verrückt macht, wenn Sie nicht Ihren eigenen Code pflegen. Zum Beispiel
i = j * 5;
... in C weißt du zumindest, dass j ist mit fünf multipliziert werden und die Ergebnisse in i gespeichert.
Aber wenn Sie den gleichen Ausschnitt sehen Code in C ++, Sie wissen nichts. Nichts. Der einzige Weg zu wissen, was ist wirklich passiert in C ++ ist es herauszufinden welche Typen ich und j sind, etwas was irgendwo erklärt werden könnte überhaupt noch. Das liegt daran, dass j könnte von einem Typ sein, der Operator * hat überlastet und es tut etwas schrecklich witzig, wenn Sie es versuchen multipliziere es. Und ich könnte von einer Art sein Das hat Operator = überladen, und die Typen sind möglicherweise nicht kompatibel automatische Typzwangsfunktion könnte am Ende wird aufgerufen. Und der einzige Weg herauszufinden, ist nicht nur das zu überprüfen Typ der Variablen, aber um die zu finden Code, der diesen Typ implementiert, und Gott helfe dir, wenn es Erbschaft gibt Irgendwo, weil du jetzt musst traipse den ganzen Weg bis zur Klasse Hierarchie, die alle selbst versuchen Finde heraus, wo dieser Code wirklich ist und ob Irgendwo ist Polymorphie, du bist wirklich in Schwierigkeiten, weil es nicht ist genug um zu wissen, welcher Typ ich und j sind erklärt, müssen Sie wissen, welcher Typ sie sind gerade jetzt, was könnte involvieren das Untersuchen einer beliebigen Menge von Code und du kannst nie wirklich sein sicher, wenn du überall hingeschaut hast Danke an das Halteproblem (puh!).
Wenn du i = j * 5 in C ++ siehst, bist du es wirklich auf dich selbst, bubby, und das, in meinen Augen, reduziert die Fähigkeit zu Erkennen Sie mögliche Probleme nur durch Blick auf Code.
Aber auch das ist ein Feature. (Ich weiß, dass ich modifiziert werde, aber zum Zeitpunkt des Schreibens sprachen nur eine Handvoll Posts über die Nachteile der Überlastung des Bedieners)