Kurze Frage zu statischen Objekten



  • Hallo zusammen,
    die Bedeutung einer statischen Variablen ist mir an sich klar. Sie wird einmal erzeugt, doch da sie nicht aufm Stack liegt, wird
    sie nach dem Verlassen der ÜE nicht wieder zerstört. So kann man zum Beispiel einen Counter machen.

    Gibt es irgendeinen Nutzen oder einen Moment, wo es sich als sinnvoll erweist eine globale Variable als statische zu definieren.

    Also so:

    #include <iostream>
    
    static int a = 4;
    
    int main()
    {
    ...
    }
    

    Hier ist a ja global, doch wann könnte/sollte man diese auch statisch machnen? Globale Variablen werden ja sowieso erst beim
    Programmende zerstört.

    [edit]: Kann man hier eigentlich von einer globalen Variablen sprechen, da static ja irgendwie immer einen privaten Charakter vergibt!?

    [nochmaledit]: Eigentlich kann dann eine solche Variable doch maximal modulglobal sein, oder?

    Vielen Dank
    lg, freakC++



  • Das Schlüsselwort static begrenzt den Gültigkeitsbereich einer globalen Variable auf das Modul, wo es definiert ist.



  • Du bist aber auch spitzfindig 😉

    Ich würde sagen, es ist eine globale Variable, weil sie halt nicht lokal und keine Instanzvariable ist. Die Sichtbarkeit spielt für die Wortwahl keine Rolle.

    static in diesem Zusammenhang beschränkt die Sichtbarkeit der Variablen auf diese TU. Das Schlüsselwort muss in C verwendet werden, um genau dies zu erreichen. In C++ gibt es hierfür anonyme Namespaces, die man auch vorziehen sollte. In diesem Sinne gibt es also in C++ keinen Grund für diese Anwendung von static.

    Stefan.



  • naja, aer manchmal erweisen sie sich aber echt als hilfreich.

    zum Beispiel bei einem Counter in der Methode...die Methode muss einfach immer wieder aufgerufen werden und die statische Variable wird um 1 erhöht! Komfortabler gehts doch nicht.

    lg, freakc++



  • freakC++ schrieb:

    naja, aer manchmal erweisen sie sich aber echt als hilfreich.

    zum Beispiel bei einem Counter in der Methode...die Methode muss einfach immer wieder aufgerufen werden und die statische Variable wird um 1 erhöht! Komfortabler gehts doch nicht.

    lg, freakc++

    Das verstehe ich nicht. Dein Beispiel zeigt doch eine Variable außerhalb jeder Funktion. Mein Posting bezieht sich auch genau darauf. Eine lokale Variable (also eine in einer Funktion) mit static ist eine ganz andere Sache...

    Stefan.



  • freakC++ schrieb:

    die Bedeutung einer statischen Variablen...

    Die Bedeutung des static Schlüsselwortes kommt zumindest auf den Kontext an.

    Es gibt 3 Kontexte, in denen man static benutzen kann:
    1. Namensraum
    2. innerhalb einer Klassendefinition
    3. innerhalb einer Funktion

    Und in all den drei Kontexten macht es etwas anderes
    1. erzwingt interne Bindung (anonyme Namensräume können das auch!)
    2. deklariert "statisches" Element einer Klasse mit externer Bindung
    3. definiert Funktions-lokales Objekt mit statischer Lebenszeit, welches vor Programmbeginn "zero-initialized" und erst bei der ersten Ausführung der Funktion richtig initialisiert wird (Funktionsaufruf, Konstructor, etc).

    Und das ist u.A. die Schwierigkeit von C++. Schlüsselwörter wie static und extern machen, je nachdem in welchem Kontext sie auftauchen, etwas anderes.

    freakC++ schrieb:

    Gibt es irgendeinen Nutzen oder einen Moment, wo es sich als sinnvoll erweist eine globale Variable als statische zu definieren.

    Versuch mal die Frage selbst zu beantworten.

    freakC++ schrieb:

    #include <iostream>
    
    static int a = 4;
    
    int main()
    {
    ...
    }
    

    Hier ist a ja global, doch wann könnte/sollte man diese auch statisch machnen? Globale Variablen werden ja sowieso erst beim
    Programmende zerstört.

    Was ist denn Deine Definition von "global"?

    freakC++ schrieb:

    [edit]: Kann man hier eigentlich von einer globalen Variablen sprechen, da static ja irgendwie immer einen privaten Charakter vergibt!?

    [nochmaledit]: Eigentlich kann dann eine solche Variable doch maximal modulglobal sein, oder?

    Was ist denn Deine Definition von "modulglobal"?

    Ich will Dich mit den Fragen nicht ärgern. Ich halte sie gerade nur für didaktisch sinnvoll. Du lernst wahrscheinlich am besten, wenn Du Dir das jetzt selbst erarbeitest. Die letzten Threads, die Du gestartet hattest, kannst Du ja nochmal durchlesen. Da steht recht viel an Info drin.

    Gruß,
    SP


Anmelden zum Antworten