Unterschied zwischen const-Member und static const



  • Hallo,

    angenommen man hat eine Klasse, nennen wir sie Raumschiff, der man ein konstantes Attribut (Geschwindigkeit) zuweisen will. Wo liegt dann der Unterschied zwischen folgenden Varianten:

    class Raumschiff
    {
    private:
        const float Geschwindigkeit;
    };
    

    und

    class Raumschiff
    {
    private:
        static const float Geschwindigkeit;
    };
    


  • Im ersten Fall ist Geschwindigkeit für die Instanz eine Konstante. Wie jede Konstante kann sie nur bei ihrer Definition gesetzt werden. Doch bei jedem Objekt neu:

    class Test
    {
        const float m_v;
    
      public:
    
        Test (float v)
            :
        m_v(v) // m_v kann aber jedes mal anders initialisiert werden
        {
        }
    
        void method ()
        {
            // m_v ist eine Konstante und kann nicht verändert werden
        }
    };
    

    Der Unterschied zu static const sollte nun schon deutlich sein -> da es die Variable pro Typ nur einmal gibt ist sie nicht instanzkonstant sondern typkonstant.

    MfG SideWinder



  • das erste ist ans Objekt gebunden, man kann es also wie sidewinder schon sagte für jede instanz anders initialisieren. das zweite ist typ gebunden, dh die geschwindigkeit ist für alle objekte vom typ raumschiff gleich.

    zudem ist es erlaubt, in der static const variante sowas zu schreiben:

    class Raumschiff
    {
    private:
        static const float Geschwindigkeit=5;
    };
    

    also man kann es direkt vor ort initialisieren(bzw muss es auch, denn wo sollte man es sonst tun)



  • otze schrieb:

    also man kann es direkt vor ort initialisieren(bzw muss es auch, denn wo sollte man es sonst tun)

    Eigentlich gehts so:

    class Raumschiff
    {
    private:
        static const float Geschwindigkeit;
    };
    
    const float Raumschiff::Geschwindigkeit = 5;
    

    die andere Schreibweise gibts nur deswegen:

    struct F
    {
        static const int size = 10;
        static feld[size];
    };
    


  • dass es bei normal static so geht, ist klar 🙄

    ich zitier mich hier ja nur ungern, aber:

    zudem ist es erlaubt, in der static const variante sowas zu schreiben:



  • das war nur die antwort auf "wo sollte man es sonst tun"


Log in to reply