Was ist ein Objekt?



  • (aus diesem Thread)

    pumuckl schrieb:

    ... fühlt euch ermutigt, die Diskussion in einem neuen Thread, evtl. sogar im RudP-Forum fortzusetzen 😉

    Ich denke, das meiste dazu ist bereits gesagt worden. Ich fasse meien Standpunkt dennoch hier mal in einem neuen Thread zusammen:

    Bleibt man auf der sprachneutralen Ebene (nicht Java- oder C++-spezifisch), sind es immernoch diese drei Eigenschaften, die ein Objekt ausmachen:
    - Identität
    - Zustand
    - Verhalten

    Bleibt man auf der C++-spezifischen Ebene, gibt der Standard eine eigene Definition von "Objekt" vor, die meiner Meinung nach praktisch und der Sprache entsprechend angepasst ist.

    1.8 The C++ object model

    The constructs in a C++ program create, destroy, refer to, access, and manipulate objects. An object is a region of storage. [ Note: A function is not an object, regardless of whether or not it occupies storage in the way that objects do. —end note ] An object is created by a definition (3.1), by a new-expression (5.3.4) or by the implementation (12.2) when needed. The properties of an object are determined when the object is created. An object can have a name (clause 3). An object has a storage duration (3.7) which influences its lifetime (3.8). An object has a type (3.9). The term object type refers to the type with which the object is created. Some objects are polymorphic (10.3); the implementation generates information associated with each such object that makes it possible to determine that object’s type during program execution. For other objects, the interpretation of the values found therein is determined by the type of the expressions (clause 5) used to access them.

    Hierbei gibt es keine Einschränkung des Objekt-Begriffes auf "Instanzen von Klassen". int-Variablen beziehen sich hier genauso auf Objekte. Trotzdem ist die Bedeutung des Begriffs mit dem von der sprachneutralen, eher abstrakten Idee konsistent. C++ versucht die Unterschiede zwischen benutzerdefinierten Typen und dem Rest zu minimieren. Es gibt daher auch keinen guten Grund dafür, nur Instanzen von Klassen "Objekte" zu nennen und die anderen "Dinger" nicht. Ich kann mir einen Zeiger auf eine Instanz einer Klasse genauso geben lassen, wie einen Zeiger auf "einen int ", new int funktioniert genauso wie new MeineKlasse . Unterschiede gibt es lediglich in der Komplexität. Ein Objekt eines bestimmten Klassentyps mag nicht mehr trivial- oder überhaupt kopierbar sein. Na und?

    Dass sich das nicht mit jedem anderen "Objektmodell" deckt, ist klar. Beispiel: Java. Java ist aber auch eine ganz andere Sprache. Dort steht in der Language-Spec 3.0, §4.3.1:

    An object is a class instance or an array. The reference values (often just references) are pointers to these objects, and a special null reference, which refers to no object. A class instance is explicitly created by a class instance creation expression (§15.9). An array is explicitly created by an array creation expression (§15.10). [...]

    Eine solche Unterscheidung ist auch sinnvoll in dieser Sprache, da solche "Objekte" etwas ganz anderes als zB "int-Variablen" sind.

    Gruß,
    SP



  • Was war die ursprüngliche Frage? Klingt danach, ob ein "object" im Sinne des C++-Standards dasselbe Objekt wie bei "objektorientierter Programmierung" ist. Die Frage kannst du dir ganz einfach beantworten, indem du die "object"-Definition im C-Standard nachschlägst.



  • Leider ist mir das zu viel. Ich bin ein Kind des Privatfernsehens und habe eine Konzentrationsspanne von max 10 Sekunden.
    Kann man den C++-Objektbegriff nicht kürzer fassen?
    Zum Beispiel "Ein Objekt ist was, dessen Adresse man mit dem operator& holen kann (solange der nicht lustig überladen ist)." oder "Ein Objekt ist was, was man mit reinterpret_cast ordentlich kaputtmachen kann." oder sowas einfaches? Damit wäre mir sehr geholfen.



  • Grundsätzlich finde ich es auch OK, Instanzen von PODs als Objekte zu bezeichnen. Bloß habe ich hierfür bisher noch nie eine Begründung benötigt 😉

    Ich frage mich, ob das hier:

    The properties of an object are determined when the object is created.

    auch auf PODs zutrifft. Ich meine nicht, denn der Wert einer POD-Variablen ist ohne weitere Maßnahmen nach der Erzeugung undefiniert.

    Stefan.



  • Bashar schrieb:

    Klingt danach, ob ein "object" im Sinne des C++-Standards dasselbe Objekt wie bei "objektorientierter Programmierung" ist.

    Woraus ziehst Du diese Erkenntnis?
    Die C++ Definition beschreibst aus Informatik-Sicht eher eine Entitätsklassen denn ein Objektklassen. Die Definition für Entitätstypen trifft aber ebenso auf alle C Typen zu.





  • knivil schrieb:

    On Understanding Data Abstraction, Revisited

    Kopier mal den Absatz raus, wo steht, was ein Objekt ist.



  • Tachyon schrieb:

    Bashar schrieb:

    Klingt danach, ob ein "object" im Sinne des C++-Standards dasselbe Objekt wie bei "objektorientierter Programmierung" ist.

    Woraus ziehst Du diese Erkenntnis?
    Die C++ Definition beschreibst aus Informatik-Sicht eher eine Entitätsklassen denn ein Objektklassen. Die Definition für Entitätstypen trifft aber ebenso auf alle C Typen zu.

    +1

    Ich sehe nicht, wo und wie ein Objektbegriff in C++ wirklich relevant ist. In C++ ist eher der Typ des Objektes interessant, also Array, Class, Union, POD, oder anderes.



  • Aus der Einleitung:

    While objects and ADTs are fundamentally different,
    they are both forms of data abstraction. [..]
    algebras relate to abstract data types, while characteristic
    functions are a form of object.

    Aus 3.

    There is not a single universally accepted model of
    object-oriented programming. The model that I present here
    is recognized as valid by experts in the field, although there
    certainly are other valid models.

    Aus 3.10:

    An object is a value exporting a procedural interface to data
    or behavior. Objects use procedural abstraction for informa-
    tion hiding, not type abstraction. Object and and their types
    are often recursive. Objects provide a simple and powerful
    form of data abstraction. They can be understood as clo-
    sures, first-class modules, records of functions, or processes.
    Objects can also be used for procedural abstraction.

    Ich moechte das Paper nicht werten, da es ein Essay ist und durchaus subjektive Komponenten enthaelt. Aber vielleicht gibt es ja Denkanstoesse. Es ist sehr formal.



  • Tachyon schrieb:

    Bashar schrieb:

    Klingt danach, ob ein "object" im Sinne des C++-Standards dasselbe Objekt wie bei "objektorientierter Programmierung" ist.

    Woraus ziehst Du diese Erkenntnis?

    Was für eine Erkenntnis? Ich hatte nach einer Klarstellung der Frage gefragt.



  • Bashar schrieb:

    Tachyon schrieb:

    Bashar schrieb:

    Klingt danach, ob ein "object" im Sinne des C++-Standards dasselbe Objekt wie bei "objektorientierter Programmierung" ist.

    Woraus ziehst Du diese Erkenntnis?

    Was für eine Erkenntnis? Ich hatte nach einer Klarstellung der Frage gefragt.

    Der zitierte Satz ist aber eine Aussage und keine Frage.



  • Richtig. Der Satz sagt aus, dass ich vermute, dass die Frage ist, ob ein Objekt im C++-Sinne und ein Objekt im OOP-Sinne dasselbe sind.

    Können wir jetzt bitte mit dem Kindergarten aufhören?



  • Bashar schrieb:

    Können wir jetzt bitte mit dem Kindergarten aufhören?

    Naja, immerhin wirst Du Deinem Namen gerecht.



  • Bashar schrieb:

    Was war die ursprüngliche Frage?

    Es gibt keine ursprüngliche Frage. Ich habe mit einer kleinen Randbemerkung in dem anderen Thread offensichtlich eine Diskussion zum Objekt-Begriff losgetreten (über die Hälfte der Posts in dem Thread).

    Stein des Anstoßes war:
    A: "Entweder speichert dein Vektor Objekte oder Zeiger"
    B: "Wenn der Vektor Zeiger speichert, sind das auch Objekte, Zeiger-Objekte."

    Für A gilt Objekt = Instanz einer Klasse
    Für B gilt Objekt = region of storage (nach C++ Definition)

    Ich wollte das nur in diesen Thread umlenken und meinen Standpunkt nochmal darlegen. Mehr nicht. Kurzfassung: Ich sehe keinen guten Grund, warum ich den Objekt-Begriff auf Instanzen von Klassen einschränken soll, wenn C++ eine andere Terminologie vorgibt und versucht die Grenzen zwischen UDTs und nicht-UDTs zu verwischen (UDT = user defined type). Zumindest ist dadurch klar geworden, dass auch C++ Programmierer sich unter "Objekt" nicht immer das gleiche vorstellen. Mehr kann dieser Thread wohl auch nicht leisten.

    Gruß,
    SP



  • Der ursprüngliche Streitpunkt war unter anderem meine Aussage:

    "Objekte sind Instanzen von Klassen". Ich betrachte int, float, char, etc. nicht als Objekt und stehe damit angeblich im Widerspruch zum Standard. 😉 Ich böser! 😃



  • Wenn ich noch ein bissel krümelkacken darf:

    It0101 schrieb:

    Der ursprüngliche Streitpunkt war unter anderem meine Aussage:

    "Objekte sind Instanzen von Klassen". Ich betrachte int, float, char, etc. nicht als Objekt

    Ich auch nicht. Das sind Objekttypen 🙂
    ("Types describe objects, references, or functions", aus §3.9)



  • Sebastian Pizer schrieb:

    Kurzfassung: Ich sehe keinen guten Grund, warum ich den Objekt-Begriff auf Instanzen von Klassen einschränken soll, wenn C++ eine andere Terminologie vorgibt...

    Ich verstehe deine Auffassung, werde aber dennoch den Begriff so verwenden wie es im Sprachgebrauch meiner bisherigen Berufslaufbahn verwendet wurden ist (=>Instanz).

    Sebastian Pizer schrieb:

    Zumindest ist dadurch klar geworden, dass auch C++ Programmierer sich unter "Objekt" nicht immer das gleiche vorstellen.

    Dem stimme ich zu, nur glaube ich wenn man im Satz "Objekt oder Zeiger" schreibt, jeder soweit mitdenken kann, das man Zeiger nicht als Objekt ansieht. Unabhängig von irgendeinen C++ Standard.



  • asc schrieb:

    Ich verstehe deine Auffassung, werde aber dennoch den Begriff so verwenden wie es im Sprachgebrauch meiner bisherigen Berufslaufbahn verwendet wurden ist (=>Instanz).

    Leuchtet mir nicht ein.

    int i = 10; //typ ist int, instanz heißt i und hat einen zustand
    //es lässt sich eine reihe von operationen ausführen
    class T{....};
    T obj; //typ ist T, instanz heißt obj und hat einen zustand.
    //es lässt sich eine reihe von operationen ausführen
    
    //Wieso eine Unterscheidung?
    


  • Tachyon schrieb:

    Leuchtet mir nicht ein.

    int i = 10; //typ ist int, instanz heißt i und hat einen zustand
    //es lässt sich eine reihe von operationen ausführen
    class T{....};
    T obj; //typ ist T, instanz heißt obj und hat einen zustand.
    //es lässt sich eine reihe von operationen ausführen
    

    Tachyon schrieb:

    //Wieso eine Unterscheidung?

    weil sonst eine sprache, in der es int i=10; gibt, aber nicht class T{....} obj; auch als ojektorienttiert gelten müsste. *fg*
    🙂



  • Tachyon schrieb:

    //Wieso eine Unterscheidung?
    

    Weil damit eine Instanz einer Klasse gemeint war, und auch so in meinen bisherigen Firmen im Sprachgebrauch verwendet wird (Die sich übrigens in 90% mit C++ beschäftigt haben).


Log in to reply