Statische Klassenmember

Ein klein wenig über Umwege heute zum Thema "statische Klassenmember". Die gehören nämlich nicht zu einem bestimmten Objekt, sondern sind pro Klasse nur einmal vorhanden.

Video

Quellcode

#include <iostream>

class Test
{
  static unsigned int counter;

public:

  Test()
  {
    ++counter;
  }
  
  ~Test()
  {
    --counter;
  }
  
  unsigned int getCounter() const
  {
    return counter;
  }
};

unsigned int Test::counter = 0;

int main()
{
  Test t1;
  std::cout << t1.getCounter() << std::endl;
  {
    Test t2;
    std::cout << t1.getCounter() << std::endl;
    {
      Test t3;
      std::cout << t3.getCounter() << std::endl;
    }
  }
  std::cout << t1.getCounter() << std::endl;
}

Erklärung

Die Variable counter in der Klasse Test ist als static markiert. Will heißen: es gibt sie genau einmal im Programm und nicht einmal in jedem Objekt. Deswegen muss sie auch außerhalb der Klasse noch definiert werden. In der Klasse ist nur die Deklaration. Dafür reserviert der Compiler aber keinen Speicherplatz. Das tut er erst in Zeile 25. Die Syntax dort ist noch an mehr Stellen gebräuchlich: unsigned int Test::counter heißt, dass wir die Variable counter der Klasse Test außerhalb der Klasse definieren. Die Deklaration (also das Bekanntmachen des Namens) muss innerhalb der Klasse erfolgen. Interessant ist das in dem Fall, wo man die Definition der Schnittstelle der Klasse und die Definition der einzelnen Methoden trennen will (bspw. um Header-Dateien an Kunden ausliefern zu können, ohne gleich immer auch die Implementierung mitzuliefern). Dort sieht die Syntax genauso aus:

class Example
{
   void method();
};

void Example::method() 
{
  // Code
}

In dem Beispiel können die Deklaration der Methode in Zeile 3 und die Definition ab Zeile 6 auch in unterschiedlichen Dateien stehen (bspw. Header und Implementierung).

Wie man an den verschiedenen Ausgaben von getCounter() oben sehen kann, ist die Variable counter für alle Klassen die gleichen. Effektiv zählt der Beispielcode als die Anzahl der Objekte vom Typ Test im Programm.