Was sind die Hauptunterschiede zwischen Objective-C und C ++ in Bezug auf Syntax, Funktionen, Paradigmen, Frameworks und Bibliotheken?
* Wichtig: Mein Ziel ist es nicht, einen Leistungskrieg zwischen den beiden Sprachen zu beginnen. Ich möchte nur wirklich harte Fakten. Tatsächlich bezieht sich meine Frage nicht auf die Leistung! Bitte geben Sie Quellen für alles an, was subjektiv erscheint.
c++
objective-c
Wachsamkeit
quelle
quelle
Antworten:
Kurze Liste einiger der wichtigsten Unterschiede:
bool
,true
undfalse
, Objective-C AnwendungenBOOL
,YES
undNO
.void*
undnullptr
, Objective-C bevorzugtid
undnil
.SEL
) als ungefähres Äquivalent zu Funktionszeigern.nil
, im Gegensatz zu C ++, das abstürzt, wenn Sie versuchen, eine Mitgliedsfunktion von aufzurufennullptr
Objective-C ermöglicht einen dynamischen Versand, sodass die Klasse, die auf eine Nachricht reagiert, zur Laufzeit bestimmt werden kann, im Gegensatz zu C ++, bei dem das Objekt, auf das eine Methode aufgerufen wird, zur Kompilierungszeit bekannt sein muss (siehe Kommentar von wilhelmtell unten). Dies hängt mit dem vorherigen Punkt zusammen.self
Klasseninitialisierer (ähnlich wie Konstruktoren) eine völlig andere Klasse zurückgeben, falls dies gewünscht wird. Im Gegensatz zu C ++ wird beim Erstellen einer neuen Instanz einer Klasse (entweder implizit auf dem Stapel oder explizit übernew
) garantiert, dass sie vom ursprünglich angegebenen Typ ist.int foo (void)
undint foo (int)
definieren Sie eine implizite Überladung der Methodefoo
, aber um dies in Objective-C zu erreichen, sind die expliziten Überladungen- (int) foo
und erforderlich- (int) foo:(int) intParam
. Dies liegt daran, dass die benannten Parameter von Objective-C funktional der Namensverfälschung von C ++ entsprechen.alloc
Nachricht oder implizit in einer geeigneten Factory-Methode).Meiner Meinung nach ist der wahrscheinlich größte Unterschied die Syntax. Sie können in beiden Sprachen im Wesentlichen das Gleiche erreichen, aber meiner Meinung nach ist die C ++ - Syntax einfacher, während einige der Funktionen von Objective-C bestimmte Aufgaben (z. B. das GUI-Design) dank des dynamischen Versands erleichtern.
Wahrscheinlich auch viele andere Dinge, die ich verpasst habe. Ich werde sie mit allen anderen Dingen aktualisieren, an die ich denke. Abgesehen davon kann ich den Führer, auf den LiraNuna Sie hingewiesen hat, nur empfehlen. Ein anderer interessanter Ort könnte dies übrigens sein .
Ich sollte auch darauf hinweisen, dass ich gerade erst anfange, Objective-C selbst zu lernen, und daher sind viele der oben genannten Punkte möglicherweise nicht ganz richtig oder vollständig - ich entschuldige mich, wenn dies der Fall ist, und begrüße Verbesserungsvorschläge.
BEARBEITEN: aktualisiert, um die in den folgenden Kommentaren angesprochenen Punkte zu berücksichtigen, und der Liste einige weitere Elemente hinzugefügt.
quelle
void*
undNULL
nur nicht für Objekte. Sie können in Obj-C einen beliebigen Zeiger im C-Stil verwenden, und viele API-Aufrufe übergeben oder geben Werte tatsächlich als Referenz zurück. In diesem FallNULL
wird sie häufig verwendet.Während beide in C verwurzelt sind, sind sie zwei völlig verschiedene Sprachen.
Ein wesentlicher Unterschied besteht darin, dass sich Objective-C auf Laufzeitentscheidungen für den Versand konzentriert und stark von seiner Laufzeitbibliothek abhängt, um Vererbung und Polymorphismus zu handhaben, während in C ++ der Fokus normalerweise auf statischen Entscheidungen zur Kompilierungszeit liegt.
In Bezug auf Bibliotheken können Sie einfache C-Bibliotheken in beiden Sprachen verwenden - ihre nativen Bibliotheken sind jedoch völlig unterschiedlich.
Interessant ist jedoch, dass Sie beide Sprachen mischen können (mit einigen Einschränkungen). Das Ergebnis heißt Objective-C ++ .
quelle
Sie sind völlig anders. Ziel C hat mehr mit Smalltalk gemeinsam als mit C ++ (naja, bis auf die Syntax wirklich).
quelle
Aus dem Kopf:
Der größte Unterschied ist für mich das Modellsystem. Mit Obj-C können Sie Messaging und Introspektion durchführen, aber C ++ verfügt über die leistungsstarken Vorlagen.
Jeder hat seine Stärken.
quelle
Wie andere gesagt haben, ist Objective-C viel dynamischer in Bezug auf die Denkweise von Objekten im Vergleich zu C ++ 's ziemlich statischem Bereich.
Objective-C gehört zur Smalltalk-Linie objektorientierter Sprachen und hat ein Konzept von Objekten, das dem von Java, Python und anderen objektorientierten Nicht-C ++ - Standardsprachen sehr ähnlich ist. Viel dynamischer Versand, keine Überlastung des Bedieners, Nachrichten senden.
C ++ ist ein seltsames Tier. Der Smalltalk-Teil des Stammbaums wurde größtenteils übersprungen. In gewisser Weise verfügt es über ein gutes Modulsystem mit Unterstützung für die Vererbung, das zufällig für die objektorientierte Programmierung verwendet werden kann. Die Dinge sind viel statischer (überschreibbare Methoden sind zum Beispiel nicht die Standardeinstellung).
quelle
Objective-C ist eine perfektere Obermenge von C. In C und Objective-C ist implizites Casting von
void*
zu einem Strukturzeiger zulässig.C ++ wird nur kompiliert, wenn der
void
Zeiger explizit umgewandelt wird:Die Relevanz für die tägliche Programmierung ist Null, nur eine lustige Trivia-Tatsache.
quelle
Foo* bar = reinterpret_cast< Foo* >(malloc(sizeof(Foo));
dann vielleicht den Inplace-Konstruktor verwenden. Aber ab heute ist das moderne C ++ eher soauto bar = new Foo(constructorArg);
, als ob Sie kein Malloc benötigen, und Sie können entweder Callic verwendenstd::vector::reserve
, undstd::vector::emplace_mack
Obj-C verfügt über viel dynamischere Funktionen in der Sprache selbst, während sich C ++ mehr auf Funktionen zur Kompilierungszeit mit einigen dynamischen Funktionen konzentriert.
In wird der parametrische C ++ - Polymorphismus zur Kompilierungszeit überprüft, während in Obj-C der parametrische Polymorphismus durch dynamischen Versand erreicht wird und zur Kompilierungszeit nicht überprüft wird.
Obj-C ist von Natur aus sehr dynamisch. Sie können einer Klasse zur Laufzeit Methoden hinzufügen. Außerdem wird zur Laufzeit eine Selbstbeobachtung durchgeführt, um Klassen zu betrachten. In C ++ kann sich die Definition der Klasse nicht ändern, und die gesamte Selbstbeobachtung muss zur Kompilierungszeit erfolgen. Obwohl die Dynamik von Obj-C in C ++ mithilfe einer Funktionskarte (oder ähnlichem) erreicht werden könnte, ist sie immer noch ausführlicher als in Obj-C.
In C ++ gibt es viel mehr Überprüfungen, die zur Kompilierungszeit durchgeführt werden können. Beispielsweise kann der Compiler mithilfe eines Variantentyps (wie einer Union) erzwingen, dass alle Fälle geschrieben oder behandelt werden. Sie vergessen also nicht, die Randfälle eines Problems zu behandeln. Alle diese Prüfungen haben jedoch beim Kompilieren einen Preis. Obj-C kompiliert viel schneller als C ++.
quelle