2013-04-11 16 views
5

Helfen Sie mir, dies zu verstehen, Wenn ich alle C++ - Standards einschließlich C++ 11 betrachte, ist es richtig zu sagen, dass das einzige Objekt, mit dem ich umgehen kann, eine Instanz einer Klasse ist?In C++ ist eine "Klasseninstanz" der einzige Objekttyp?

Was ist mit anderen Spielern wie Lambdas? Eine Instanz eines POD wird als Objekt betrachtet?

Ich weiß, dass dies klingt wie ein kleines Detail, aber die meisten Male fand ich Konzepte aus anderen Sprachen schwer zu vergleichen, wenn ich diese Art von Problemen habe zu definieren, was ein Objekt ist und was nicht, insbesondere in funktionalen OOP-Sprachen.

+0

'int x;' ist 'x' eine Instanz einer Klasse? – Pubby

+0

@Pubby aber meine Frage ist: Was ist ein Objekt? Welche Art von Definition existiert für dieses Wort in der Programmierwelt und was sind die Konsequenzen in den C++ - Definitionen? Für was ich weiß int ist ein Typ von std :: int, also ist es eine Klasse, also x in diesem Fall ist es eine Bezeichnung für ein Objekt, aber ich habe noch nicht definiert, was ein Objekt wirklich ist. – user2269624

+1

Es gibt keine Klasse wie 'std :: int'. –

Antwort

8

Wenn ich alle C++ - Standards einschließlich C++ 11 in Betracht ziehe, ist es richtig zu sagen, dass das einzige Objekt, mit dem ich umgehen kann, eine Instanz einer Klasse ist?

Nein, dies ist nicht korrekt.

In C++ bezieht sich der Begriff "Objekt" auf einen Speicherbereich, der nach Eigenschaften (wie dem Typ), die dem Objekt zugewiesen werden, eine bestimmte Interpretation erhält.

Per Ziffer 1.8/1 des C++ 11 Standard:

Die Konstrukte in einem C++ Programm erstellen, zerstören, beziehen sich auf, den Zugriff und Objekte manipulieren. Ein Objekt ist ein Speicherbereich. [Hinweis: Eine Funktion ist kein Objekt, unabhängig davon, ob sie den Speicher in der Weise belegt, die Objekte ausführen. -end note] Ein Objekt wird durch eine Definition (3.1), durch einen neuen Ausdruck (5.3.4) oder durch die Implementierung (12.2) bei Bedarf erzeugt. Die Eigenschaften eines Objekts werden festgelegt, wenn das Objekt erstellt wird. Ein Objekt kann einen Namen haben (Abschnitt 3). Ein Objekt hat eine Speicherdauer (3.7), die seine Lebensdauer (3.8) beeinflusst. Ein Objekt hat einen Typ (3.9). Der Begriff Objekttyp bezieht sich auf den Typ, mit dem das Objekt erstellt wird. Einige Objekte sind polymorph (10.3); Die Implementierung erzeugt Informationen, die mit jedes dieser Objekte verknüpft sind, die es ermöglichen, den Typ dieses Objekts während der Programmausführung zu bestimmen. Für andere Objekte wird die Interpretation der darin gefundenen Werte durch die Art der für den Zugriff verwendeten Ausdrücke (Abschnitt 5) bestimmt.

Also im Grunde ein int ein Objekt ist, ist eine Instanz eines POD ein Objekt, und natürlich eine Instanz einer Klasse-Typ ist ein Objekt. In OOP bezeichnet der Begriff "Objekt" normalerweise nur die letztere Entität, aber in C++ ist dies nicht der Fall.

Was ist mit anderen Spielern wie Lambdas?

Lambdas sind eigentlich syntaktischer Zucker unnamed functors zu definieren (Absatz 5.1.2/1):

Lambda-Ausdrücke stellen eine präzise Art und Weise einfache Funktionsobjekte zu erstellen. [...]

Auch (nach Absatz 5.1.2/2):

Die Auswertung einer Lambda-Expression ergibt einen prvalue temporary (12.2). Dieses Provisorium wird Verschluss Objekt genannt. [...] [Hinweis: Eine Schließung Objekt verhält sich wie ein Funktionsobjekt (20.8). - Endnote]

Daher lambdas sind Ausdrücke, deren Auswertungsergebnisse in der Schaffung eines temporären Objekts (also ja, in gewissem Sinne könnte man lambdas sagen sind auch Objekte, oder besser gesagt, dass sie ergeben ein Objekt).

+0

Ich verstehe nicht, warum die Tatsache, dass _temporary_ es ist so wichtig ist, wenn die Definition ist über einen Zustand zu halten, warum die Tatsache, dass es temporär ist relevant, ich meine alles in einem C++ Code hat ein Leben lang, die Tatsache, dass etwas bietet eine kürzere Lebenszeit für die Daten, die so relevant sind? also warum lambdas keine objekte sind? – user2269624

+0

@ user2269624: Ein temporäres Objekt ist ein Objekt. Das sollte die fett gedruckte Schrift hervorheben. Aber ja, die Tatsache, dass Lambda-Ausdrücke zu Objekten ausgewertet werden, wird noch später im selben Absatz erwähnt, also denke ich, dass ich die Betonung entfernen kann –

2

in C++ ein Objekt ist eine Region des Speichers mit einem zugeordneten Typ

z.B. ein int

braucht die Region nicht notwendigerweise zusammenhängend sein

als Beispiel mit virtuellen Mehrfachvererbung Teile eines Objekts sein kann (im Sinne gibt es einige Situationen, in denen es sein) verbreiten

2

Traditionelle OOP neigt dazu, den Begriff "Objekt" als eine "polymorphe Entität" zu definieren, die Methoden und Daten trägt und von anderen Objekten auf Algorithmen referenziert werden kann.

Die C++ - Definition des Objekts ist - im Wesentlichen - "was auch immer ein Raum braucht, um einen Zustand zu erhalten". Dies führte zu dem Hauptunterschied, dass C++ "Objekte" "Wertverhalten" haben und dass "Methoden" nicht notwendigerweise Mitglieder sind und Objekte nicht notwendigerweise Laufzeit-Polymorphismus unterstützen müssen.

C++ - Programm, das der traditionellen OOP-Definition folgt, endet mit Klassen, die durch (smart) - (Basis) - (Zeiger | Referenz) verwiesen werden, wobei der Umleitungsmechanismus als Schlüssel zum Auflösen von Polymorphismus zur Laufzeit verwendet wird.

Moderne C++ verwendet Objekt als Wert kopieren oder verschieben Semantik und neigt dazu, Polymorphismus zur Kompilierungszeit mit Vorlagen und generische Algorithmen und Typ Merkmale zu adressieren.

Die zwei Dinge sind nicht eins gegeneinander, aber C++ ist absichtlich das Verschmelzen von beiden, daher reduziert die Definition von "Objekt" die traditionelle OOP (Instanz einer Klasse, auf die verwiesen wird), ist -in Tatsache, die Hälfte der C++ - Funktionen und Möglichkeiten wegzuschneiden.

Über Lambda-Ausdrücke, es strengen Sinne sind sie Ausdrücke (nicht Objekte selbst) Rückkehr anonyme typisierten Objekte. So

sagen, sie sind Objekte ungeeignet ist: a+b es ist nicht selbst ein Objekt: es erzeugt ein Objekt (das Ergebnis des Ausdrucks).Das gleiche gilt für [](){}: es ist nicht selbst ein Objekt: es ein Objekt erzeugt, können Sie sogar speichern, wie in

auto fn = [](){}; //create a lambda and assign to fn. 
fn();    //just calls it 

Der fn Typ ist so etwas wie

class lambda_uniquename 
{ 
public: 
    void operator()() 
    {} 
}; 

Das Objekt, hier, ist nicht die lambda Klasse, sondern die fn Variable.

Verwandte Themen