C++ Kurs

Statische Member

Die Themen:

Statische Eigenschaften

Statische Eigenschaften sind Eigenschaften die für alle Objekte einer Klasse nur ein einziges Mal vorhanden sind. Des Weiteren werden statische Eigenschaften standardmäßig immer mit 0 initialisiert und auf sie kann auch ohne Bezug auf ein bestimmtes Objekt zugegriffen werden, wenn sie public sind.

Um eine statische Eigenschaft zu definieren sind zwei Schritte erforderlich:

  1. Zuerst muss innerhalb der Klasse die statische Eigenschaft deklariert werden. Dazu ist bei der Deklaration vor dem Datentyp der Eigenschaft das Schlüsselwort static anzugeben.
  2. Da die statische Eigenschaft für alle Objekte der Klasse nur einmal vorhanden ist, muss sie explizit außerhalb der Klasse definiert werden. Die Definition erfolgt prinzipiell genauso wie die Definition einer normalen Variable, jedoch wird vor dem Eigenschaftsnamen noch die zugehörige Klasse angegeben. Beachten Sie, dass hier nicht mehr das Schlüsselwort static stehen darf!
PgmHeader
// Klassendefinition
class Window
{
   ...
   static short noOfWin;    // Deklaration der statischen Eigenschaft
   ...
};
// Definition der statischen Eigenschaft
short Window::noOfWin = 0;
HinweisSelbstverständlich können Sie eine statische Eigenschaft bei ihrer Definition auch mit einem Wert initialisieren, so wie oben angegeben.

Der Zugriff auf eine statische Eigenschaft aus einer Memberfunktion seiner Klasse heraus erfolgt gleich wie der Zugriff auf normale Eigenschaften. Ist die statische Eigenschaft public, so kann auch von außerhalb der Klasse ohne Bezug auf ein Objekt auf diese Eigenschaft zugegriffen werden. In diesem Fall muss (wie unten angegeben) vor den Eigenschaftsnamen noch der Klassenname angegeben werden.

PgmHeader
// Klassendefinition
class Window
{
   ...
 public:
   Window();               // ctor
   ~Window();              // dtor
   static short noOfWin;   // Statische Eigenschaft
   ...
};
// Definition der statischen Eigenschaft
short Window::noOfWin = 0;
// Zugriff aus Memberfunktion heraus
Window::Window()
{
   ...
   noOfWin++;     // Anzahl Fenster inkrementieren
}
Window::~Window()
{
   ...
   noOfWin--;     // Anzahl Fenster dekrementieren
}

// main() Funktion
main()
{
   ...
   if (Window::noOfWin != 0)  // Falls bereits Fenster erstellt wurden
      ....
}

Im Beispiel ist einen Anwendungsfall für eine solche statische Eigenschaft dargestellt. Die Eigenschaft noOfWin wird hier als Zähler für die Anzahl der erstellten Fensterobjekte verwendet. Da die statische Eigenschaft mit 0 initialisiert wird, muss im Konstruktor dieser Zähler einfach nur um eins erhöht und im Destruktor wieder um eins vermindert werden. Selbstverständlich sollte in der Praxis dieser Zähler nicht, wie oben angegeben, public sein. Dies dient nur zur Demonstration des direkten Zugriffs auf eine statische Eigenschaft.

Statische Memberfunktionen

Sehen wir uns nun die statischen Memberfunktionen einer Klasse an. Statische Memberfunktionen besitzen eine Reihe von Einschränkungen:

  1. Sie haben nur Zugriff auf die statische Member einer Klasse (Eigenschaften und weitere Memberfunktionen).
  2. Statische Memberfunktion erhalten keinen this-Zeiger (wird im nächsten Kapitel gleich erklärt).
  3. Es darf keine statische und nicht-statische Memberfunktion mit der gleichen Signatur (Name plus Parameter) geben.
  4. Statische Memberfunktionen können nicht virtuell sein (auch das wird später noch erklärt).
  5. Statische Memberfunktionen können nicht const oder volatile sein.

Wozu statische Memberfunktionen trotz dieser vielen Einschränkungen dennoch nützlich sein können, das sehen wir uns gleich im Beispiel und der Übung an.

Um eine Memberfunktion als statische Memberfunktion zu definieren, wird bei der Deklaration bzw. Definition innerhalb der Klasse das Schlüsselwort static vor dem Returntyp der Funktion gestellt. Wird die Memberfunktion außerhalb der Klasse definiert, so darf hier das Schlüsselwort static nicht mehr angegeben werden (siehe Beispiel).

PgmHeader
// Klassendefinition
class Window
{
   ...
   static short noOfWin;        // Statische Eigenschaft
 public:
   static short GetNoOfWin();   // Deklaration statische Memberfunktion
   ...
};
// Definition der statischen Eigenschaft
short Window::noOfWin = 0;
// Definition der statischen Memberfunktion
short Window::GetNoOfWin()
{
   return noOfWin;
}

Beachten Sie stets, dass statische Memberfunktionen nur Zugriff auf statische Member haben!

Der Aufruf einer statischen Memberfunktion kann auf drei verschiedene Arten erfolgen:

  1. entweder durch sich selbst (hier nicht aufgeführt, rekursive Memberfunktion!)
  2. ohne Bezug auf ein Objekt, indem beim Aufruf vor dem Namen der Memberfunktion der Klassenname gestellt wird.
  3. in Verbindung mit einem beliebigen Objekt.

Die letzten beiden Fälle sind im nachfolgenden Beispiel dargestellt.

PgmHeader
// Klassendefinition
class Window
{
   ...     // Definitionen wie oben
};
// Definition der statischen Eigenschaft
short Window::noOfWin = 0;
// Definition der statischen Memberfunktion
short Window::GetNoOfWin()
{
   return noOfWin;
}

// main() Funktion
int main()
{
   Window myWin;
   short winCount;
   ...
   winCount = Window::GetNoOfWin();   // Direkter Aufruf
   winCount = myWin.GetNoOfWin();     // Aufruf über ein Objekt
   ...
}

Beispiel und ÜbungUnd hier geht's zum Beispiel und zur Übung.