Klasse Objekt Instanz



  • Was ist der genaue Unterschied zwischen Objekt und Instanz?



  • Was ist der genaue Unterschied zwischen Typ und Klasse?



  • noopee schrieb:

    Was ist der genaue Unterschied zwischen Objekt und Instanz?

    klasse ist ein selbetgebauter typ, der auch methoden haben kann. wie

    class Datum{
       int tag;
       int monat;
       int jahr;
       ...
       bool operator==(Datum const& b){
          return jahr==b.jahr && mnat==b.monat && tag==b.tag;
       }
    };
    

    hier ist Datum ne klasse.
    instanz ist ein ding von so ner klasse.

    Datum heute;
    

    heute ist eine instanz. eine instanz der klasse datum.

    normalerweise ist objekt genau das gleiche wie instanz. aber in der oo-literatur sieht man auch manchmal die verwendung von objekt im sinne von klasse und manchmal sieht man objekt auch in der verwendung als ding eines typs wie int.

    der unterschied zwischen typ und klasse ist, daß klassen mit dem schlüsselwort class gebaut wurden. na, vielleicht auch mal mit struct. und daneben gibt es noch andere typen wie int, double, enum, zeiger, arrays usw. die klassen, die man baut, sind auch typen.



  • Typen sind Klassen, Strukturen oder sonstige Entitäten?
    Objekte sind Instanzen von Typen?



  • noopee schrieb:

    Typen sind Klassen, Strukturen oder sonstige Entitäten?
    Objekte sind Instanzen von Typen?

    sachlich korrekt. aber man benutzt das wort "instanz" nur für instanzen von klassen, nicht für instanzen von beliebigen typen.



  • man benutzt das wort "instanz" nur für instanzen von klassen, nicht für instanzen von beliebigen typen.

    Das trifft auf die Realität nicht exakt zu:

    http://www.nickles.de/c/s/21-0007-124-3.htm
    Wie schon erwähnt verhält sich eine Klasse in C++ wie ein eingebauter Datentyp bzw. die Instanz einer Klasse (ein Objekt vom Typ einer Klasse) so wie eine Instanz eines eingebauten Datentyps.

    Angenommen, man sollte Instanz nur für Instanzen von Klassen ( und Strukturen ? ) verwenden, wie nennt man dann "Instanzen" von Nicht-Klassen?



  • Hallo,

    noopee schrieb:

    wie nennt man dann "Instanzen" von Nicht-Klassen?

    z.B. einfach "Variable":

    int a;
    

    a ist eine int-Variable. Ist zwar nicht sehr originell, aber das ist nun mal die naheliegende Bezeichnung für solche "Instanzen eingebauter Datentypen". Der Autor dieser "Nickles-Einführung" verwendet Instanz zumindest in dem Beispiel-Zitat (auch) im Sinne von "irgendeine Variable, die im Programm(-Verlauf) definiert wird" (und wenn es nur eine simple "Nicht-Klassen"-Variable ist).

    MfG



  • Spricht man eigentlich von Instanzen von Strukturen wie z.B. hier:
    http://www.red-inferno.de/cplusplus/basic/OOP/structure/main.htm ?



  • Probe-Nutzer schrieb:

    noopee schrieb:

    wie nennt man dann "Instanzen" von Nicht-Klassen?

    z.B. einfach "Variable":

    int a;
    

    Was ist mit:

    int *a = new int(0);
    int b[20] = { 0 };
    class Foo f();
    // ...
    
    *a    // Variable?
    b[10] // Variable?
    f()   // Variable?
    

    Variablen sind benannte Objekte. Es gibt aber wie gezeigt andere Möglichkeiten, Objekte zu bezeichnen.

    Ich glaube, wir müssen bei der Frage eindeutig unterscheiden, in welchem Universum wir uns überhaupt befinden. OOP oder C++? Wenn es um OOP geht, gibt es überhaupt keine primitiven Datentypen, das ist die Erfindung einzelner Sprachen. In Smalltalk beispielsweise gibt es eine Integer-Klasse, die über mehrere Ecken mit Number verwandt ist (o.ä.). Den Begriff Instanz würde ich dann synonym zu Objekt verwenden, allerdings deutet Instanz IMO eher den Gegensatz zu Klasse an (z.b. wenn man von Klassenmethoden vs. Instanzmethoden spricht.)

    Im C++-Universum gibt es den Begriff Instanz (in der Bedeutung) dagegen überhaupt nicht. Der Objektbegriff ist ebenfalls etwas weiter gefasst. Während das in der OOP irgendwelche Gebilde sind, die sich gegenseitig Nachrichten schicken, ist in C++ ein Objekt ein Speicherbereich, der Werte enthalten kann (Funktionen und Referenzen sind keine Objekte.) Man unterscheidet zwischen POD- und Nicht-POD-Objekten. Erstere definieren sich nur durch den Inhalt ihres Speicherbereiches, letztere durchlaufen einen Lebenszyklus zwischen Konstruktor und Destruktor.

    Zu "Strukturen": Weder OOP noch C++ kennen den Begriff Struktur. Was meint man damit? Klassen, die mit struct definiert wurden? Klassen, deren sämtliche Elemente public sind? POD-Klassen? Nur Klassendefinitionen, die exakt so auch in C gültig wären? Scheint aber so, als wären es in jedem Fall Klassen, also gilt das für Klassen gesagte.



  • vielleicht sollte man von Pseudo-Objekten und Pseudo-Instanzen sprechen, denn es gibt ja auch Pseudo-Konstruktoren für diese Entities:

    class X 
    {
      int i;
      float f;
      char c;
      char* s;
    public:
      X() : i(7), f(1.4), c('x'), s("hello") {} // Pseudo-ctor
    };
    
    int main() 
    {
      X x;
      int i(100); // Pseudo-ctor
      int* ip = new int(47); // Pseudo-ctor
    }
    


  • Bashar schrieb:

    Variablen sind benannte Objekte. Es gibt aber wie gezeigt andere Möglichkeiten, Objekte zu bezeichnen.

    ja, natürlich. An die anderen Fälle habe ich beim Verfassen meiner Antwort oben überhaupt nicht gedacht :).

    Für diese Fälle kann man dann mit der Bezeichnung "Objekt", wie von dir erläutert, nichts falsch machen, da diese auch der C++-Standard verwendet ("C++ object model"). Wahrscheinlich ist es sogar günstiger, einen Anfänger auch gleich mit dem Objekt-Begriff, wie er im Standard eingeführt wird, in C++ vertraut zu machen, als ihm zu erklären, mit *a oder b[10] kann man auf den int-Wert zugreifen, auch wenn ein Anfänger kaum einen Blick in den C++-Standard werfen wird.

    MfG



  • Mir gefällt folgende Sichtweise:

    Es gibt z.B.:
    - "intrinsische" Variablentypen (char, int, float, double),
    - Typen, die man über bereits hinzugefügte Bibliotheken zur Verfügung hat (vector, string, ... aus der STL)
    - Typen, die man über noch zu ergänzende Bibliotheken zur Verfügung hat (Klassen aus boost, ...)
    - selbst definierte Typen (zumeist Klassen).

    Alle diese Typen können über die Stufenleiter Deklaration (bekannt machen) -> Definition (Speicher anfordern) -> Initialisieren (Werte in den angeforderten Speicher schreiben) in "Instanzen" bzw. "Objekte" verwandelt werden.

    "int i" ist eine Instanz der Klasse "int".
    "X obj" ist eine Instanz der Klasse "X". (allgemein)

    Man kann sich darüber streiten, ob "int i" (lokale Variable) ausreicht, um eine Instanz zu bilden, da bei manchen Compilern hier kein Wert (z.B. 0) festgelegt wird. Ich sehe dies als eine Art "zufällige Instanz". Für den Programmierer wird der Speicherbereich erst wertvoll, wenn Werte gezielt zugeordnet werden (int i = 42;). Vorher stellt diese "zufällige Instanz" eine Fehlerquelle für das Programm dar.

    Bei der Idee eines Objektes denkt man vor allem auch an Methoden (public member functions), damit das Nachrichtensystem zwischen Objekten funktioniert. Bei einem allgemeinen Objektbegriff gibt es eben auch Objekte ohne Methoden.

    Bezeichner wie *a oder b[10] stehen für den Inhalt eines Speicherbereiches, der über den Typ von a oder b entsprechend strukturiert wird. Prinzipiell ist es egal, wie man auf ein Objekt zugreift. Man hat in der Regel zwei Ziele: "get" (Objekt bleibt konstant) oder "set" (Objekt wird verändert).



  • Erhard Henkes schrieb:

    Bezeichner

    das sind Ausdrücke, keine Bezeichner

    wie *a oder b[10] stehen für den Inhalt eines Speicherbereiches, der über den Typ von a oder b entsprechend strukturiert wird.

    Sie stehen primär für den Speicherbereich selbst (den Lvalue), nach einer Lvalue-zu-Rvalue-Umwandlung auch für den Inhalt (den Rvalue). Ich weiß dass du das sagen wolltest, aber ich habs gerne exakt 🤡


Anmelden zum Antworten