Gibt es einen Unterschied zwischen Instanzen und Objekten?



  • Den Begriff Instanz verwendet man hauptsächlich für Klassen, während Objekt oft auch ein C++-Objekt - als Objekttyp - bezeichnet.

    int* ptr = new int[5];
    double d;
    std::string s;
    std::string& r = s;
    delete[] ptr;
    

    Hier würde ich ptr , die 5 int s, auf die ptr zeigt, d und s als Objekte bezeichnen, aber nur s als Instanz. Ganz klar sind die Begriffe (v.a. Instanz) allerdings nicht definiert, mir scheint das jedoch noch eine geläufige Verwendung zu sein.

    Im objektorientierten Kontext sind die Begriffe Instanz und Objekt dann wirklich identisch.



  • Geht man zu den Leuten von OOA/OOD, zum Beispiel Shlaer-Mellor, sieht es ein wenig anders aus. Die nehmen das Wort "Objekt" und meinen gerne auch mal "Klasse" damit. In der C++-Gemeinde ist es aber ganz Nexus.



  • Das ist sowieso noch so eine Sache, denn streng genommen müsste man unter Objektorientierten Sprachen (wie JavaScript und Objective-C) und Klassenorientierten Sprachen (wie z.T. C++/Java/z.T. PHP/.NETs) unterscheiden. Vieles handelt man in C++ innerhalb von Klassen ab und spielt ein wenig mit den Objekten umher, z.B. Zeigerei.
    In JS ist die meiste Arbeit bei den Objekten, da die "Klassen", wie DOM, schon definiert sind.



  • "Instanz" ist die (in diesem Zusammenhang) ziemlich verunglückte Übersetzung des englischen Begriffs "instance", was nichts andres als "Exemplar" bedeutet. Das wäre in C++ das Exemplar einer Klasse oder eines Typs, was wiederum nichts anderes als ein Objekt sein kann.

    Für mich sind "Instanz" und "Objekt" von der Bedeutung her gleich. Lediglich die Verwendung der Begriffe ist leicht verschieden, denn "Instanz" führt irgendwie immer auf eine Klasse hin.

    Anders als Nexus würde ich übrigens einen Pointer oder eine Referenz nie als "Objekt" bezeichnen. Es sind Verweise auf Objekte (oder Instanzen), und ihnen fehlen die meisten der typischen Objekt-Eigenschaften.

    Stefan.



  • DStefan schrieb:

    Anders als Nexus würde ich übrigens einen Pointer oder eine Referenz nie als "Objekt" bezeichnen. Es sind Verweise auf Objekte (oder Instanzen), [...]

    Was ist mit Smart Pointers? Sind das für dich Objekte? Oder Iteratoren?

    DStefan schrieb:

    [...] und ihnen fehlen die meisten der typischen Objekt-Eigenschaften.

    Das stimmt eben nicht. Von der Sprache her gesehen haben Zeiger sehr viel gemeinsam mit anderen Objekttypen. C++ hat skalare Datentypen in vielerlei Hinsicht möglichst konform zu Klassen eingerichtet, sodass man unter anderem auch mit Templates möglichst generisch und einheitlich arbeiten kann (es wird nicht etwa wie in Java zwischen Wert- und Referenzsemantik unterschieden). Da sind auch Zeiger keine Ausnahme, Referenzen allerdings schon. Referenzen sind keine Objekttypen (zum Beispiel ist es nicht möglich, auf eine Referenz "an sich" zuzugreifen, Zeiger auf Referenzen zu deklarieren oder die Grösse einer Referenz abzufragen). Man kann Zeiger an den meisten Stellen einsetzen, an denen andere Objekttypen stehen würden, die grundlegende Semantik ist die gleiche.



  • Nexus schrieb:

    DStefan schrieb:

    Anders als Nexus würde ich übrigens einen Pointer oder eine Referenz nie als "Objekt" bezeichnen. Es sind Verweise auf Objekte (oder Instanzen), [...]

    Was ist mit Smart Pointers? Sind das für dich Objekte? Oder Iteratoren?

    Das ist einfach: Smart Pointer und Iteratoren können syntaktisch wie Pointer eingesetzt werden, sind aber keine. Die Bezeichnung "Pointer" verweist auf die Verwendung, nicht auf die Art eines solchen Objekts. Ich kann für jede Klasse Dereferenzierungs-Operatoren schreiben (ob das nun sinnvoll ist oder nicht) und Objekte dieser Klasse dann wie Pointer einsetzen. Dadurch werden diese Objekte aber noch lange nicht zu Pointern.

    Nexus schrieb:

    DStefan schrieb:

    [...] und ihnen fehlen die meisten der typischen Objekt-Eigenschaften.

    Das stimmt eben nicht. Von der Sprache her gesehen haben Zeiger sehr viel gemeinsam mit anderen Objekttypen. C++ hat skalare Datentypen in vielerlei Hinsicht möglichst konform zu Klassen eingerichtet, sodass man unter anderem auch mit Templates möglichst generisch und einheitlich arbeiten kann (es wird nicht etwa wie in Java zwischen Wert- und Referenzsemantik unterschieden). Da sind auch Zeiger keine Ausnahme, Referenzen allerdings schon. Referenzen sind keine Objekttypen (zum Beispiel ist es nicht möglich, auf eine Referenz "an sich" zuzugreifen, Zeiger auf Referenzen zu deklarieren oder die Grösse einer Referenz abzufragen). Man kann Zeiger an den meisten Stellen einsetzen, an denen andere Objekttypen stehen würden, die grundlegende Semantik ist die gleiche.

    Meine Antwort hier ist ganz ähnlich wie oben: Wenn man etwas wie ein Objekt verwenden kann, bedeutet das nicht, dass es ein Objekt ist.

    Du hast Recht, wenn du sagst, dass Pointer und "richtige" Objekte in ihrer Verwendung sehr viel gemeinsam haben. Das leugne ich auch gar nicht. Für mich sind aber die Unterschiede entscheidend: Ein Pointer verweist auf ein Objekt, sein "Lebenszweck" ist, dass man ihn dereferenziert, also an die eigentliche Sache heran kommt. Ich finde diesen Unterschied semantisch wichtig.

    Andererseits ist dies schon eine eher müßige Diskussion. Unsere Auffassungen sind etwa drei Millimeter auseinander 😉 Und im Moment kann ich mir nicht vorstellen, dass in deiner oder meiner Ansicht die Erleuchtung liegt....

    Stefan.



  • Also für mich können durchaus Objekte auf andere Objekte verweisen, deshalb gibt es für mich keinen Grund, Zeiger und Verweise nicht Objekte zu nennen.
    Aber das ist nicht wichtig. "Objekt" ist nunmal sowas schwammiges wie "Ding". Sind Dinge nur Sachen, die man anfassen kann? Da gehen die Meinungen auseinander und das macht nix. Es wäre nur unhöflich, wie Prof84 es immer macht, eine persönliche Definition als Grundlage zu nehmen, um Schwachsinn zu belegen. Lieber wie Jester machen und selbst 333 nicht schreiben, sondern 3(33), damit keine Mißverständnisse entstehen. Also im Zweifelsfall Instanz, Datenelement, Verweis, Zeiger oder sonst einen treffenderen Namen wählen, statt nur Ding, oder gar einen Relativsatz benutzen, der das dann erläutert.


  • Administrator

    DStefan schrieb:

    Für mich sind aber die Unterschiede entscheidend: Ein Pointer verweist auf ein Objekt, sein "Lebenszweck" ist, dass man ihn dereferenziert, also an die eigentliche Sache heran kommt. Ich finde diesen Unterschied semantisch wichtig.

    Diese Unterscheidung verstehe ich nicht so recht. Jedes Objekt hat einen Lebenszwecke, deshalb verliert das Objekt ja nicht seinen Objektstatus, sondern macht es erst recht zum Objekt.

    Der Zweck des Objekts Pointer ist nunmal das verweisen auf andere Objekte. So wie es Objekte gibt, welche den Zweck haben einen Zeichenkette zu verwalten, bzw. auf eine Menge anderer Objekte zu verweisen 😉

    DStefan schrieb:

    Andererseits ist dies schon eine eher müßige Diskussion. Unsere Auffassungen sind etwa drei Millimeter auseinander 😉 Und im Moment kann ich mir nicht vorstellen, dass in deiner oder meiner Ansicht die Erleuchtung liegt....

    Wenn ich mich allerdings recht erinnere, so redet auch der Standard über Objekte, wie es Nexus macht.

    ...

    Daher liegt die Erleuchtung ganz klar in der draconischen Lehre 🤡

    (In der Vorschau noch gesehen)
    Da gebe ich dir absolut recht volkard. Die Definition von Objekt oder Objektorientierung über Sprachgrenzen hinweg, wird erst recht witzig. Alle verstehen irgendwie was anderes darunter 😃

    Grüssli



  • Nexus schrieb:

    Den Begriff Instanz verwendet man hauptsächlich für Klassen, während Objekt oft auch ein C++-Objekt - als Objekttyp - bezeichnet.

    int* ptr = new int[5];
    double d;
    std::string s;
    std::string& r = s;
    delete[] ptr;
    

    Hier würde ich ptr , die 5 int s, auf die ptr zeigt, d und s als Objekte bezeichnen, aber nur s als Instanz. Ganz klar sind die Begriffe (v.a. Instanz) allerdings nicht definiert, mir scheint das jedoch noch eine geläufige Verwendung zu sein.

    Im objektorientierten Kontext sind die Begriffe Instanz und Objekt dann wirklich identisch.

    Bedanke mich für diese Aufklärung. Ich wusste gar nicht, dass das Wort "Objekt" auch im Zusammenhang mit C++-Objekten als Objekttyp benutzt wird, sonst hätte ich nicht erst gefragt.

    Gruß, skully.



  • Dieser Beitrag wurde gelöscht!

Anmelden zum Antworten