Frage

Warum kann es nicht nur regelmäßige Funktionsaufrufe sein? Neu ist im Wesentlichen:

malloc(sizeof(Foo));
Foo::Foo();

Während löschen ist

Foo:~Foo();
free(...);

Warum also neu / löscht am Ende mit einer eigenen Syntax ist eher als normale Funktionen zu sein?

War es hilfreich?

Lösung

Hier ist ein Stich an es:

Der new Operator ruft die operator new() Funktion. Auch der delete Operator ruft die operator delete() Funktion (und ähnlich für die Array-Versionen).

Warum ist dies so? Da der Benutzer berechtigt ist, operator new() außer Kraft zu setzen, aber nicht der new Operator (das ist ein Schlüsselwort). Sie überschreiben operator new() (und löschen) Ihre eigene allocator zu definieren, aber Sie sind nicht verantwortlich (oder was das betrifft dürfen) für entsprechende Konstruktoren und Destruktoren aufrufen. Diese Funktion wird automatisch vom Compiler aufgerufen, wenn es das new Schlüsselwort sieht.

Ohne diese Dichotomie, könnte ein Benutzer die operator new() Funktion außer Kraft setzen, aber der Compiler würde immer noch, dies zu behandeln hat als besonderen Funktion und rufen Sie die entsprechende Konstruktor (en) für das Objekt (S) erstellt.

Andere Tipps

Sie können operator new überlasten und operator delete Ihre eigene Zuordnung Semantik zur Verfügung zu stellen. Dies ist nützlich, wenn Sie in der Bypass des Verhalten des Heap-Allocator Standard wollen. Zum Beispiel, wenn Sie viele Instanzen eines kleinen, mit fester Größe Objekt zuweisen und freigeben, können Sie wollen einen Pool Allocator für seine Speicherverwaltung verwenden.

Mit new und delete als explizite Betreiber wie andere Betreiber macht diese Flexibilität einfacher auszudrücken C ++ 's Betreiber Überlastung Mechanismus.

Für auto Objekte auf dem Stapel, Zuteilung / Konstruktoraufruf und Freigabe / destructor Anrufe sind grundsätzlich transparent, wie Sie verlangen. :)

Weil es keine Möglichkeit gibt complie Zeit Typsicherheit mit einer Funktion (malloc () gibt void *, erinnert) zu liefern. Zusätzlich C ++ versucht sogar eine geringste Chance vergeben, aber nicht initialisierte Objekte zu beseitigen Umlauf. Und es gibt Objekte da draußen ohne Standardkonstruktor - für diese, wie würden Sie füttern Konstruktorargumente auf eine Funktion? Eine Funktion wie diese erfordern würde zu viel von einer Spezialfall-Behandlung; leichter ist es zu einer Sprache-Funktion zu fördern. So Betreiber neu.

'new / delete' sind Schlüsselwörter in der Sprache C ++ (wie 'für' und 'while'), während malloc / calloc Funktionsaufrufe in der Standard-C-Bibliothek sind (wie 'printf' und 'Schlaf'). Sehr unterschiedliche Tiere, mehr als ihre ähnliche Syntax lassen auf kann.

Der Hauptunterschied besteht darin, dass ‚neue‘ und ‚Löschen‘ Trigger zusätzliche Benutzercode - speziell, Konstruktoren und Destruktoren. Alle malloc nicht gesetzt beiseite einige Speicher für Sie zu nutzen. Wenn beiseite Speicher für ein einfaches einfachen alten Daten (Schwimmern oder ints, zum Beispiel), ‚neu‘ und ‚malloc‘ sehr ähnlich verhalten. Aber wenn Sie Platz für eine Klasse fragen, die ‚neue‘ Keyword-Sets beiseite Speicher und ruft dann einen Konstruktor dieser Klasse zu initialisieren. Großer Unterschied.

Warum C ++ verfügen über separate Syntax für Größer-als-? Warum kann es nicht nur ein regelmäßiger Funktionsaufruf sein?

greaterThan(foo, bar);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top