Sinn von 'static'?



  • In einer Klasse kann man static variblen für nützliche Dinge wie einen Counter gebrauchen. Z.b. eine Variable soll immer um eins erhöht werden, wenn ein Objekt erstellt wird, und um eins dekrementiert werden wenn es zerstört wird, so eine Variable muss static sein.



  • In der Klasse ist es eine instanzunabhängige Variable, die sich also auf die Klasse und nicht auf ein bestimmtes Objekt der Klasse bezieht. Ansonsten:

    Eine Variable der Speicherklasse static ist gültig von der ersten Verwendung bis zum Programmende. Zusätzlich verändert static die Eigenschaften beim Linken mehrerer Dateien. Static-Variablen und Funktionen sind nur in der eigenen Datei gültig und bekannt. Ein Binden (Linken) über Dateigrenzen hinweg findet nicht statt.



  • Erhard Henkes schrieb:

    In der Klasse ist es eine instanzunabhängige Variable, die sich also auf die Klasse und nicht auf ein bestimmtes Objekt der Klasse bezieht. Ansonsten:

    Eine Variable der Speicherklasse static ist gültig von der ersten Verwendung bis zum Programmende. Zusätzlich verändert static die Eigenschaften beim Linken mehrerer Dateien. Static-Variablen und Funktionen sind nur in der eigenen Datei gültig und bekannt. Ein Binden (Linken) über Dateigrenzen hinweg findet nicht statt.

    Heißt das wenn ich eine Klasse A habe, mit einer statischen Variable v, dann ist das hier nicht erlaubt ?? :

    A.v = 10;
    

    bzw. die Variable abfragen auch nicht ?



  • gast gast schrieb:

    Heißt das wenn ich eine Klasse A habe, mit einer statischen Variable v, dann ist das hier nicht erlaubt ?? :

    A.v = 10;
    

    bzw. die Variable abfragen auch nicht ?

    Das ist mit dieser Syntax sowieso nicht erlaubt. Wenn, dann folgendes:

    class A
    {
       public:
          int a;
          static int b;
    };
    
    int main()
    {
       A obj;
       obj.a = 3; // Zugriff auf normale Variablen -> betrifft nur Instanz obj
       A::b = 4;  // Zugriff auf statische Variablen -> betrifft Klasse selber, keine Instanz
    }
    


  • statische Objekte (Singelton)...





  • Ich versteh nur Bahnhof...
    Warscheinlihc bin ich zu blöd um zu kapieren, worum es bei static geht...



  • Quellcode schrieb:

    Ich versteh nur Bahnhof...
    Warscheinlihc bin ich zu blöd um zu kapieren, worum es bei static geht...

    So schwer ist das ja nicht. Nexus's Code hat es ja auf den Punkt gebracht. Was verstehts du daran nicht?



  • class A
    {
       public:
          int a;
          static int b;
    };
    
    int main()
    {
       A obj;
       obj.a = 3; // Zugriff auf normale Variablen -> betrifft nur Instanz obj
       A::b = 4;  // Zugriff auf statische Variablen -> betrifft Klasse selber, keine Instanz
    }
    

    heißt "A::b = b;", dass automatisch die Instanz der Klasse A mit "b=4" initialisiert wird, oder geschieht erst danach? Und gilt dies auch für alle instanzen oder nur für diese eine?



  • Nabend,

    Quellcode schrieb:

    class A
    {
       public:
          int a;
          static int b;
    };
    
    int main()
    {
       A obj;
       obj.a = 3; // Zugriff auf normale Variablen -> betrifft nur Instanz obj
       A::b = 4;  // Zugriff auf statische Variablen -> betrifft Klasse selber, keine Instanz
    }
    

    heißt "A::b = b;", dass automatisch die Instanz der Klasse A mit "b=4" initialisiert wird, oder geschieht erst danach? Und gilt dies auch für alle instanzen oder nur für diese eine?

    Nein initialisiert wird hier noch gar nichts. Korrekterweise muesste noch ein

    int A::b;
    

    in den Quellcode mit aufgenommen werden (wahlweise auch mit einer
    Initialisierung). a nennen wir eine Element- oder Membervariable. Sie wird pro
    Instanz erzeugt. b nennen wir eine Klassenvariable, sie ist von der konkreten
    Instanz unabhaengig und als Instanzuebergreifend anzusehen. Dem zur folge
    existiert sie im Speicher auch nur einmal und ist fuer die Dauer der Programm-
    ausfuehrung gueltig.

    gruss
    v R


Anmelden zum Antworten