Kann jemand bitte erklären, wie statische Variablen in Mitgliedsfunktionen in C ++ funktionieren.
Gegeben die folgende Klasse:
class A {
void foo() {
static int i;
i++;
}
}
Wenn ich mehrere Instanzen von deklariere A
, foo()
erhöht der Aufruf einer Instanz die statische Variable i
auf allen Instanzen? Oder nur der, auf den es gerufen wurde?
Ich nahm an, dass jede Instanz eine eigene Kopie von haben würde i
, aber das Durchgehen eines Codes, den ich habe, scheint etwas anderes anzuzeigen.
static int i
der Instanz spezifisch macht , so dass z. B.o1.foo(); // i = 1
und$o2.foo(); // i = 1
...?m_
, um den Status von i anzuzeigen.Das Schlüsselwort
static
hat in C ++ leider einige unterschiedliche BedeutungenBei Verwendung für Datenelemente bedeutet dies, dass die Daten in der Klasse und nicht in Instanzen zugewiesen werden .
Bei Verwendung für Daten innerhalb einer Funktion bedeutet dies, dass die Daten statisch zugeordnet, beim ersten Eingeben des Blocks initialisiert und bis zum Beenden des Programms gültig sind. Auch die Variable ist nur innerhalb der Funktion sichtbar. Diese Besonderheit der lokalen Statik wird häufig verwendet, um die verzögerte Konstruktion von Singletons zu implementieren.
Bei Verwendung auf Ebene der Kompilierungseinheit (Modul) bedeutet dies, dass die Variable wie eine globale Variable ist (dh zugewiesen und initialisiert, bevor sie
main
ausgeführt und nach demmain
Beenden zerstört wird ), dass die Variable jedoch in anderen Kompilierungseinheiten nicht zugänglich oder sichtbar ist .Ich habe den Teil hervorgehoben, der für jede Verwendung am wichtigsten ist. Die Verwendung von (3) wird zugunsten nicht benannter Namespaces, von denen auch nicht exportierte Klassendeklarationen möglich sind, etwas abgeraten.
In Ihrem Code wird das
static
Schlüsselwort mit der Bedeutung Nummer 2 verwendet und hat nichts mit Klassen oder Instanzen zu tun. Es ist eine Variable der Funktion und es wird nur eine Kopie davon geben.Wie iammilind richtig sagte, hätte es jedoch mehrere Instanzen dieser Variablen geben können, wenn die Funktion eine Vorlagenfunktion gewesen wäre (da in diesem Fall die Funktion selbst tatsächlich in vielen verschiedenen Kopien im Programm vorhanden sein kann). Auch in diesem Fall sind Klassen und Instanzen natürlich irrelevant ... siehe folgendes Beispiel:
quelle
keyword static unfortunately has a few different unrelated meanings in C++
:)Statische Variablen innerhalb von Funktionen
Die statische Variable wird innerhalb einer Funktion erstellt und im statischen Speicher des Programms gespeichert, nicht auf dem Stapel.
Die Initialisierung der statischen Variablen erfolgt beim ersten Aufruf der Funktion.
Die statische Variable behält den Wert in mehreren Funktionsaufrufen bei
Die Lebensdauer der statischen Variablen beträgt Programm
Beispiele
Ausgabe :
Statische Variable
Variabler Wert: 0
Variabler Wert: 1
Variabler Wert: 2
Variabler Wert: 3
Variabler Wert: 4
Automatische Variable
Variablenwert: 0
Variablenwert: 0
Variablenwert: 0
Variablenwert: 0
Variablenwert: 0
quelle
Vereinfachte Antwort:
Statische Variablen
class
verhalten sich - unabhängig davon, ob sie Mitglieder einer Funktion (ohne Vorlage) oder einer Funktion (ohne Vorlage) sind - technisch gesehen - wie eine globale Bezeichnung, deren Gültigkeitsbereich auf dieclass
Funktion oder beschränkt ist.quelle
MyClass& instance(){ static MyClass x("config.ini"); return x; }
- eine gültige tragbare Implementierung für die Verwendung mit einem Thread, genau weil lokale Statik trotz Ihrer Aussagen NICHT einfach wie eine globale ist.