Fragen zu Objektorientiertem Programmieren



  • Hallo, ich versuche gerade mir Objekorientiertes Programmieren beizubringen.

    Was Klassen Attribute sind habe ich ja halbwegs verstanden. Aber nun meine Fragen:

    Habe ich es richtig verstanden, dass Klassenattribute außerhalb der Klasse (nocheinmal) deklarriert werden müssen?

    Wenn ja, wozu ist das gut?



  • Also zumindest in den gängisten OO-Sprachen wie C++ und Java muss das nicht sein. In C++ musst du statische (static) Klassenattribute nochmals außerhalb der Klasse *definieren* aber nicht deklarieren.

    MfG SideWinder



  • Also so:?

    class Egal {
      static int a;
    
    Egal() {}
    
    }
    
    int Egal::a = 0;
    

    Ist das richtig so?



  • Dir fehlt der Strichpunkt nach der Klassendefinition, aber ansonsten ist das richtig ja. Und wie gesagt, für normale Attribute brauchst du das nicht zu machen:

    class Example
    {
        int a;
    
        Example ()
            : // Initialisierungsliste für Attribute beginnen
        a(0) // a mit 0 initialisieren
        {
        }
    };
    
    // Keine weiteren Anweisungen notwendig
    

    MfG SideWinder



  • So hast du die Variablen initialisiert:

    class Example 
    { 
        int a; 
    
        Example () 
            : // Initialisierungsliste für Attribute beginnen 
        a(0) // a mit 0 initialisieren 
        { 
        } 
    }; 
    
    // Keine weiteren Anweisungen notwendig
    

    Ich habe das bisher immer so verstanden und auch gemacht:

    class Example 
    { 
        int a; 
    
        Example () 
    
        { 
        a=0;
        } 
    }; 
    
    // Keine weiteren Anweisungen notwendig
    

    Ist das falsch?



  • Der Compiler wird dir in den meisten Fällen den gleichen Code daraus erzeugen. Bloß musst du wissen, dass du nicht in allen Fällen soetwas tun kannst. Was nämlich laut C++ eigentlich passiert:

    class AndereKlasse
    {
        AndereKlasse (); // Std-Ctor
        AndereKlasse (const AndereKlasse& rhs); // Copy-Ctor
        AndereKlasse& operator= (const AndereKlasse& rhs); // Zuweisungs-Op (Assign-Op)
    };
    
    class Example
    {
        AndereKlasse attribut;
    
        // FALL 1
        Example (AndereKlasse param)
            // Keine Init-Liste, alle Elemente mit Default-Ctor aufrufen
            // Impliziter Aufruf von attribut()
        {
            attribut = param; // Hier findet eine zusätzliche Zuweisung statt
                              // Impliziter Aufruf von attribut.operator=(param)
        }
    
        // FALL 2
        Example (AndereKlasse param)
            :
        a(i) // Hier wird sofort AndereKlasse(param) aufgerufen, der Copy-Ctor also
        {
        }
    };
    

    Die meisten Compiler werden dir Fall 1 auf Fall 2 optimieren und du merkst nichts. Aber in manchen Fällen gibts zB keinen Default-Ctor und Fall 1 wird dir einen Compiler-Fehler melden. Auch musst du, wenn du vererbst (kA wie weit du dich schon mit OO beschäftigt hast) den Basisklassen-Ctor in der Init-Liste aufrufen wenn er Parameter benötigt.

    MfG SideWinder



  • Ergänzung:

    SideWinder schrieb:

    In C++ musst du statische (static) Klassenattribute nochmals außerhalb der Klasse *definieren* aber nicht deklarieren.

    Wobei man das nicht machen muss, wenn man eine Konstante direkt in der Klasse initialisiert. Denn Initialisierung bedeutet automatisch Definition. Das funktioniert allerdings nur mit integralen Typen

    class Example
    {
        static const int a = 0;
    };
    

Anmelden zum Antworten