Laut Wikipedia :
Ein Objekt ist erstklassig, wenn es:
Jemand hat mir einmal gesagt, dass rohe Zeiger keine erstklassigen Objekte sind, während intelligente Zeiger wie std :: auto_ptr sind. Aber für mich scheint ein roher Zeiger (auf ein Objekt oder auf eine Funktion) in C ++ die oben genannten Bedingungen zu erfüllen, um als ein Objekt der ersten Klasse zu gelten. Fehle ich etwas?
Eigentlich beide - "Zeiger sind FCO" und "Zeiger sind nicht FCO" - sind richtig. Wir müssen die Aussagen im jeweiligen Kontext nehmen. (FCO - Erstklassiges Objekt)
Wenn wir in C ++ von einem 'Zeiger' sprechen, sprechen wir von einem Datentyp, der die Adresse einiger anderer Daten speichert. Ob das nun FCO ist oder nicht, hängt wirklich davon ab, wie wir es uns vorstellen. Leider ist diese Benutzungssemantik für Pointers in C ++ nicht eingebaut.
Wenn wir Zeiger verwenden, um nur auf Daten zu zeigen, erfüllt dies die Anforderungen, ein FCO zu sein. Wenn wir jedoch einen Zeiger verwenden, um Daten zu "halten", dann kann sie nicht länger als FCO betrachtet werden, da ihre Kopien- und Zuweisungssemantik nicht funktioniert. Solche 'Resource Handling'-Zeiger (oder direkter als' rohe Zeiger 'bezeichnet) sind unser Interesse im Zusammenhang mit der Smart Pointer-Studie. Diese sind nicht FCO während die entsprechenden Smart Pointer sind. Im Gegensatz dazu würden bloße Tracking-Zeiger weiterhin die Anforderungen für ein FCO erfüllen.
Der folgende Abschnitt aus dem Buch "Modern C ++ Design" erläutert den Punkt auf anschauliche Weise.
Ich zitiere aus dem Kapitel über intelligente Zeiger:
Ein Objekt mit Wertesemantik ist ein Objekt, das Sie kopieren und zuweisen können zu. Typ int ist das perfekte Beispiel für ein erstklassiges Objekt. Sie können erstellen, Kopieren Sie und ändern Sie ganzzahlige Werte frei. Ein Zeiger, den du benutzt hast Iterieren in einem Puffer hat auch einen Wert Semantik - Sie initialisieren es zu zeigen an den Anfang des Puffers, und Sie stoßen es an, bis Sie das Ende erreichen. Auf dem Weg können Sie seinen Wert kopieren zu anderen Variablen vorübergehend halten Ergebnisse.
Mit Zeigern, die Werte enthalten Mit Neuem zugeteilt, jedoch die Geschichte ist sehr unterschiedlich. Sobald du hast geschrieben
Widget * p = neues Widget; Die Variable p zeigt nicht nur auf den Speicher, sondern besitzt auch diesen zugewiesen für das Widget-Objekt. Dies Weil Sie später löschen müssen p um sicherzustellen, dass das Widget-Objekt ist zerstört und sein Gedächtnis ist freigegeben. Wenn in der Zeile nach der Zeile gerade gezeigt, dass Sie schreiben
p = 0; // weise p etwas anderes zu Sie verlieren das Eigentum an dem Objekt, auf das zuvor p und Sie gezeigt haben haben überhaupt keine Chance, in den Griff zu bekommen es wieder. Sie haben ein Ressourcenleck, und Ressourcenlecks helfen nie.
Ich hoffe, dies verdeutlicht.
Die Definition von "First-Class" in Wikipedia ist falsch. In einer Programmiersprache wird eine Entität als "erstklassig" angesehen, wenn sie keine spezielle Behandlung durch den Compiler erfordert und wie jedes andere Objekt in der Sprache interpretiert, verstanden, verwendet werden kann. Die Ursachenzeiger in C ++ sind keine Objekte der ersten Klasse, da *p
für einen Zeiger p
nicht so interpretiert wird, dass einfach ein überladener Operator * aufgerufen wird, wie es bei jedem anderen Objekt der Fall wäre; stattdessen muss der Compiler p
speziell behandeln, basierend auf der Tatsache, dass es ein Zeigertyp ist. Wenn Sie einen Zeiger oder eine Referenz übergeben, können Sie einfach kein Wertobjekt übergeben (und einige dieser Wertobjekte sind Zeiger), aber Sie sagen tatsächlich, dass es sich um einen anderen Typ (einen Zeigertyp oder einen Referenztyp) handelt ein Werttyp), und seine Interpretation / Verwendung hängt von seinem Typ ab.
Ein gutes Beispiel für eine Sprache, in der alle Objekte erstklassig sind, ist Python. In Python ist alles mit einer Art von Typ assoziiert, es kann als ein Objekt behandelt werden, es kann Mitglieder, Funktionen usw. haben. Als extremes Beispiel sind sogar Funktionen in Python Objekte, die einfach Code enthalten und zufällig aufrufbar sind ; Wenn Sie versuchen, die Funktion mithilfe der __call__-Elementfunktion aufzurufen (die in C ++ dem Überladen von operator () ähnelt und andere nichtfunktionsfähige Objekte bereitstellen kann), gibt eine normale Funktion einen Funktionswrapper als Ergebnis zurück ( damit Sie Funktionen nicht als Sonderfall behandeln müssen). Sie können sogar Funktionen zu Funktionen hinzufügen, wie Sie es bei anderen Objekten tun würden. Hier ist ein Beispiel für so etwas:
%Vor%Ich entschuldige mich für die Python in einem C ++ - Post, aber es ist schwer, das Konzept ohne den Kontrast zu erklären.
Der Wikipedia-Artikel ist Scheiße (ausnahmsweise stimme ich mit "Zitat benötigt" überein), aber Sie vermissen nichts: gemäß der Wikipedia-Definition und auch nach einer vernünftigen Definition sind rohe C ++ - Zeiger erste- Klassenobjekte .
Wenn jemand freiwillig bei Google Search for Google suchen möchte, würde ich diesen Wikipedia-Artikel gerne sehen. Ich bin Experte, aber ich bin auch sehr beschäftigt - ich hätte gerne einen Partner, mit dem ich daran arbeiten könnte.
Wie Mike bemerkte, scheint hier etwas Verwirrung mit dem Wort Objekt zu bestehen. Ihr Freund scheint zwischen Objekten wie "Objekte der ersten Klasse" und Objekten als "Instanzen von C ++ Klassen" zu verwirren, zwei sehr unterschiedliche Dinge, bei denen das Wort Objekt für zwei völlig verschiedene Dinge verwendet wird.
Bei der objektorientierten Programmierung wird das Wort Objekt verwendet, um von einigen Datenstrukturen zu sprechen, die Datenfelder sammeln und Methoden, um sie zu manipulieren. Mit C ++ definieren Sie sie in Klassen, erhalten Vererbung, etc.
Andererseits hat das Wort Objekt in dem Ausdruck "Objekt erster Klasse" eine viel breitere Bedeutung, nicht beschränkt auf Objekte objektorientierter Sprachen. Eine ganze Zahl gilt als ein Objekt erster Klasse, ein Zeiger auch. Ich glaube, dass "Objekte" mit der anderen Bedeutung nicht wirklich als erstklassiges Objekt in C ++ (sie tun in anderen OO-Programmiersprachen) aufgrund von Einschränkungen bei der Parameterübergabe geeignet sind (aber Sie können Zeiger oder Verweise darauf weitergeben, den Unterschied ist nicht so groß).
Dann sind die Dinge wirklich das Gegenteil von dem, was Sie sagten: Zeiger sind Objekte der ersten Klasse, aber keine Instanzen von C ++ - Klassen, intelligente Zeiger sind Instanzen von C ++ - Klassen, sind aber keine Objekte der ersten Klasse.
Von Wiki :
Beim Computing ein Objekt erster Klasse (auch Wert, Wesen und Bürger), in der Kontext eines bestimmten Programmiersprache, ist eine Entität welches als ein Parameter übergeben werden kann, von einer Subroutine zurückgegeben, oder in eine Variable zugewiesen. 1 Informatik der Begriff Verdinglichung wird verwendet, wenn auf den Prozess Bezug genommen wird (Technik, Mechanismus) des Machens etwas ein erstklassiges Objekt. [Zitat benötigt]
Ich habe den gesamten Eintrag in wiki-pedia für den Kontext eingefügt. Gemäß dieser Definition - eine Entität, die als Parameter übergeben werden kann - wäre der C ++ - Zeiger ein Objekt der ersten Klasse.
Zusätzliche Links, die das Argument unterstützen: catalogsoft wapedia
Vergegenständlichung : Bezieht sich auf den Prozess (Technik, Mechanismus), um etwas zu einem erstklassigen Objekt zu machen
Tags und Links c++ programming-languages