Sinn von 'static'?



  • Hi,
    also ich frage mich immer wieder, wofür man konkret statische Variablen braucht. Hab jetzt diverse Bücher zu C++ angelesen/durchgelesen bzw. mich durch online tutorials geschlagen, wo zwar immer die Funktionsweise von 'static' erklärt wird, aber ein vernünftiges Beispiel fällt mir nicht dazu ein.
    Also bisher empfand ich es immer einfacher/nicht schwerer und zum Teil sogar "definierter" den Inhalt von Variablen (wenn er denn nach dem Funktionsaufruf noch gebraucht wird) als Zeiger/Rückgabewert zu behandeln, anstelle das Ganze statisch zu realisieren.
    Als Alternative zu globalen Variablen sehe ich das ja noch ein, aber sonst...
    Gebraucht ihr statische Variable und wenn ja wofür konkret?

    cya



  • Manchmal soll jedes Objekt einer Klasse denselben Wert einer Variable haben.
    Da nehme ich dann static. Sie bleibt dann trotzdem durch Zugriffe von außen geschützt.

    Jedesmal übergeben dieser Variablen würde diesen Schutz ja auflösen bzw. das ganze Konzept der privaten Variablen übergehen.

    EDIT: Und wenn Funktionen nur in einer Übersetzungseinheit deklariert sein sollen, dann deklariere ich die auch static. Das ist zwar nicht so schön wie Namespaces, aber ich mag es trotzdem.



  • static wird auch benötigt, wenn Variablen nur innerhalb einer Funktion benötigt werden, und diese nach Beenden der Funktion noch erhalten bleiben sollen. Zum Beispiel ein Integer, der zählt, wie oft die Funktion aufgerufen wurde.

    GNU-Fan schrieb:

    Manchmal soll jedes Objekt einer Klasse denselben Wert einer Variable haben.
    Da nehme ich dann static. Sie bleibt dann trotzdem durch Zugriffe von außen geschützt.

    Ich denke eher, static bei Klassenvariablen wird dann benötigt, wenn man die Variable auch ansprechen will, ohne eine Instanz der Klasse zu haben. Statische Klassenvariablen stellen also instanzunabhängige Eigenschaften dar.



  • Der modifier static hat mehrere Bedeutungen, wie schon gesagt, bei Variable innerhalb einer Klasse, ist diese Variable nicht an eine instanz gebunden, das heißt es gibt die Variable genau 1 mal im ganzen Programm, egal wieviele Objekte von der Klasse du erstellst.

    Innerhalb einer Funktion, wurde auch schon gesagt, behält die variable ihren Wert auch wenn die Funktion beendet wird, diese static Variable bleibt auch erhalten bis das Programm beendet wird.

    Static variablen werden auch nicht auf dem Heap gespeichert genau so wie globale Variablen.

    Wenn du eine globale Variable mit static deklarierst, bedeutet das, dass diese static Variable nur in der Datei wo sie deklariert wurde sichtbar ist.

    Bei Memberfunktion die mit static deklariert worden sind gilt das gleiche wie bei Membervariablen die static deklariert worden sind, man benötigt keine Instanz der Klasse.



  • 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


Log in to reply