FSST - Hardwarenahe Programmierung
Statische Elemente
Während Elementvariablen für jedes Objekt einmal angelegt werden, existieren statische Elementvariablen pro Klasse exakt einmal, egal wie viele Objekte dieser Klasse erzeugt werden. Sie werden angelegt, bevor das erste Objekt der Klasse erzeugt wird. Eine Anwendung für eine solche Variable könnte das Zählen der instanziierten Instanzen sein. Dazu wird die statische Variable in jedem Konstruktor inkrementiert (Zeile 5 im folgenden Code) und in jedem Destruktor (Zeile 7) dekrementiert. In der statischen Variable kann dann abgelesen werden, wie viele Objekte dieser Klasse derzeit existieren.
Statische Variable und Methoden
class DigitalAus : public DigitalOut { public: DigitalAus(PinName ld) : DigitalOut(ld){ // Konstruktor staticCounter++; } ~DigitalAus(){ // Destruktor staticCounter--; } static int howMany() { // Statische Methode return staticCounter; } private: static int staticCounter; // Statische Elementvariable }; int DigitalAus::staticCounter = 0; DigitalAus led(LED1); // Erzeugen von drei Instanzen DigitalAus led2(LED2); DigitalAus led3(LED3); int main() { while (1) { { DigitalAus led3(LED3); // erzeugen einer weiteren Instanz printf("Anzahl Instanzen: %d\n", DigitalAus::howMany()); // Ausgabe: 4 } // Destruktor wird aufgerufen printf("Anzahl Instanzen: %d\n", DigitalAus::howMany()); // Ausgabe: 3 //
Deklaration
Eine statische Elementvariable wird genauso wie jede andere Elementvariable der Klasse in Zeile 14 deklariert. Es wird ihr allerdings das Schlüsselwort static
vorangestellt. Weiters muss sie noch separat von der Klasse global definiert werden (Zeile 17), wo sie auch z.B. mit 0 initialisiert wird.
Statische Funktionen
Statische Funktionen (Zeile 10 bis 12) haben mit statischen Variablen gemein, dass sie zur Klasse gehören, aber unabhängig von der Zahl oder der Existenz von Objekten verwendet werden können. Statische Funktionen werden aufgerufen, indem der Klassenname, zwei Doppelpunkte und der Funktionsname genannt werden (siehe Zeile 26). Für den Aufruf muss also kein Objekt der Klasse existieren.
Im obigen Code wird die Klasse DigitalAus drei Mal instanziiert (Zeile 19 bis 21) und daher wird in Zeile 30 der Wert 3 ausgegeben.
Frage: Warum wird in Zeile 30 drei (3) ausgegeben und nicht vier (4)?