000
17.03.2004, 07:59 Uhr
Pablo
Supertux (Operator)
|
Mir ist grad aufgefallen, dass es zu dem Schlüsselwort static nichts in der FAQ steht und finde das sehr nützlich.
virtual postete am 17.03.04 (siehe static) folgendes:
Bedeutung von static:
1. Bei Variablen:
1.a Innerhalb einer Funktion: Der Wert der Variablen bleibt zwischen zwei Funktionsaufrufen erhalten; ganz im gegensatz zu normalen automatischen variablen, die ihren Wert verlieren. Beispiele:
C++: |
void zaehler() { static int counter = 0; count++; std::cout<<"Diese Funktion wurde zum "<<counter<<". Male aufgerufen"<<std::endl;
|
oder
C++: |
char* my_itoa(int i) { static char buffer[100]; sprintf(buffer, "%d", i); return buffer; }
|
Beide oben Beispiele lassen sich nur mit solchen static Variablen realisieren.
1.b Innerhalb einer Klasse: Die Variable ist unabhängig von einem Objekt. Im prinzip sind es verkappte globale Variablen, die eben den Gültigkeitsbereich Klasse haben:
C++: |
class CounterClass { private: static int anzahlInstanzen;
public: CounterClass() { ++anzahlInstanzen; } virtual ~CounterClass() { --anzahlInstanzen; } };
|
Im obigen Beispiel wird die Variable dazu verwendet, zu zählen wie viele Instanzen einer Klasse es gibt; dh anzahlInstanzen selbst gehört allen Objekten der Klasse.
1.c Außerhalb von Klassen und Funktionen: Die Variable ist nur innerhalb der Datei gültig, in der Sie definiert wurde:
C++: |
/* a.cpp */ static int anzahl = 0; ...
|
C++: |
/* b.cpp */ static int anzahl = 0; ...
|
Baust Du ein Projekt, in dem beide Dateien vorkommen geht es mit dem Static gut: Die Variable anzahl gibt es zweimal, einmal für die Datei a.cpp und zum anderen für b.cpp. Würdest Du das static fortlassen, würde der Gültigkeitsbereich der Variablen nicht mehr auf die Datei beschränkt sein. Der Linker würde dann später spucken und sagen, daß anzahl mehrfach definiert sei, vermute ich mal.
2. Bei Funktion/Methoden:
2.a Innerhalb einer Klasse Die Funktion kann verwendet werden, ohne daß ein Objekt da ist. Beliebt zB für solche Sachen:
C++: |
class Singleton { private: Singleton(); public: static Singleton& theInstance() { static Singleton singleton; return singleton; } };
.... Singleton& theSingleton = Singleton::theInstance();
|
2.b Außerhalb einer Klasse Analog zu Fall 1.c -- A! Elbereth Gilthoniel! silivren penna míriel o menel aglar elenath, Gilthoniel, A! Elbereth! Dieser Post wurde am 17.03.2004 um 08:00 Uhr von Pablo editiert. |