Features von C ++, die nicht in C implementiert werden können?

7

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?

  1. Manche sagen, dass wir in C nicht über Methoden schreiben können, wie können wir dann verschiedene Varianten von 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.
  2. Manche sagen, Datenabstraktion wird in C ++ erreicht, also was ist mit Strukturen?
Sachin Chourasiya 01.12.2009, 11:46
quelle

14 Antworten

21

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:

  • Vererbung (Zeiger auf parent-struct in der Kind-Struktur)
  • Polymorphismus (Fake vtable mit einer Gruppe von Funktionszeigern)
  • Datenkapselung (undurchsichtige Unterstrukturen mit einer Implementierung, die in der öffentlichen Schnittstelle nicht verfügbar ist)

Unmöglich:

  • Templates (was auch Preprozessor-Schritt 2 genannt werden kann)
  • Funktion / Methode überladen durch Argumente (einige versuchen, dies mit Ellipsen zu emulieren, kommen aber nie wirklich nahe)
  • RAII (Konstruktoren und Destruktoren werden automatisch in C ++ aufgerufen, damit Ihre Stack-Ressourcen in ihrem Bereich sicher gehandhabt werden)
  • Komplexe Darsteller (in C kann man fast alles wiedergeben)
  • Ausnahmen

Sehenswert:

  • GLib (eine C-Bibliothek) hat ein ziemlich kompliziertes OO emulation
  • Ich habe eine Frage einmal darüber, was Menschen am meisten vermissen, wenn sie C anstelle von C ++ benutzen.

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 .

    
sharkin 01.12.2009 12:41
quelle
11

Wie wäre es mit RAII und Vorlagen .

    
Nick Dandoulakis 01.12.2009 11:53
quelle
3

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:

  • C ++ hat Klassen. Klassen haben Konstruktoren und Destruktoren, die Code automatisch aufrufen, wenn das Objekt initialisiert oder dekrutiert wird (außerhalb des Gültigkeitsbereichs oder mit dem Schlüsselwort delete).
  • Klassen definieren eine Hierarchie. Sie können eine Klasse erweitern. (Vererbung)
  • C ++ unterstützt Polymorphie. Dies bedeutet, dass Sie virtuelle Methoden definieren können. Der Compiler wählt anhand des Objekttyps aus, welche Methode aufgerufen werden soll.
  • C ++ unterstützt Laufzeitinformationen.
  • Sie können Ausnahmen mit C ++ verwenden.

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.

    
kgiannakakis 01.12.2009 11:53
quelle
3
  1. Es gibt nur ein printf() in der C-Standardbibliothek. Andere Varianten werden implementiert, indem der Name geändert wird, z. B. sprintf() , fprintf() usw.

  2. 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.

    
unwind 01.12.2009 11:48
quelle
3

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! ;)

    
Clifford 01.12.2009 12:52
quelle
2

Der ganze Rest ist "leicht" gefälscht:)

    
pmg 01.12.2009 11:52
quelle
2

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

    
Alon 01.12.2009 11:51
quelle
2
  

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.

    
Charles Salvia 01.12.2009 12:39
quelle
2

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.

    
AnthonyLambert 01.12.2009 13:45
quelle
0

Ein Feature, das nicht wirklich OOP-bezogen ist, sind die Standardargumente , die einen echten Schlüsselschoner darstellen können richtig verwendet.

    
Mark Rushakoff 01.12.2009 12:04
quelle
0

Überladen der Funktion

    
TanvirK 01.12.2009 12:26
quelle
0

Ich nehme an, es gibt so viele Namespaces, Templates, die nicht in C implementiert werden konnten.

    
Sachin Chourasiya 02.12.2009 08:29
quelle
-1

Es sollte nicht zu viele solcher Dinge geben, weil frühe C ++ - Compiler C-Quellcode aus C ++ - Quellcode erzeugt haben. Grundsätzlich können Sie alles in Assembler tun - aber das NICHT tun.

    
ziggystar 01.12.2009 11:51
quelle
-3

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)

    
lorenzog 01.12.2009 13:48
quelle

Tags und Links