Sind rohe C ++ - Zeiger erste Klassenobjekte?

8

Laut Wikipedia :

Ein Objekt ist erstklassig, wenn es:

  • kann in Variablen und Datenstrukturen gespeichert werden
  • kann als Parameter an ein Unterprogramm
  • übergeben werden
  • kann als Ergebnis eines Unterprogramms zurückgegeben werden
  • kann zur Laufzeit erstellt werden
  • hat eine eigene Identität (unabhängig von einem bestimmten Namen)

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?

    
Shailesh Kumar 22.04.2010, 23:14
quelle

5 Antworten

1

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.

    
Partha Pratim Das 23.04.2010, 09:24
quelle
3

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.

    
Michael Aaron Safyan 22.04.2010 23:57
quelle
2

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.

    
Norman Ramsey 23.04.2010 05:36
quelle
1

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.

    
kriss 22.04.2010 23:57
quelle
1

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

    
IAbstract 22.04.2010 23:24
quelle

Tags und Links