C++ Tutorial

Statische Member

Statische Eigenschaften

Statische Eigenschaften sind Eigenschaften, die für alle Objekte einer Klasse nur einmal vorhanden sind. Sie werden standardmäßig mit 0 initialisiert.

Eine Eigenschaft wird als statische Eigenschaft definiert, indem vor dem Datentyp der Eigenschaft inline static angegeben wird.

1: // Klassendefinition
2: class Window
3: {
4:    ...
5:    inline static short noOfWin{0}; // static Definition
6: };

Der Zugriff auf eine statische Eigenschaft aus einer Methode seiner Klasse heraus erfolgt wie der Zugriff auf eine sonstige Eigenschaft. Ist die statische Eigenschaft public, kann auch von außerhalb der Klasse ohne Bezug auf ein Objekt auf diese Eigenschaft zugegriffen werden. Dabei ist vor den Eigenschaftsnamen der Klassenname anzugeben. Alternativ kann anstelle des Klassennamens auch ein Objekt angegeben werden.

1: // Klassendefinition2: class Window
3: {
4:    ...
5: public:
6:    Window();    // ctor
7:    ~Window();   // dtor
8:    inline static short noOfWin; // Statische Eigenschaft
9: };
10: // Zugriff aus Methode heraus
11: Window::Window()
12: {
13:    noOfWin++; // Anzahl Fenster inkrementieren
14: }
15: Window::~Window()
16: {
17:    noOfWin--; // Anzahl Fenster dekrementieren
18: }
19:
20: // main() Funktion
21: main()
22: {
23:    ...
24:    // Falls bereits Fenster erstellt wurden
25:    if (Window::noOfWin != 0)
26:       ...
27: }

Im Beispiel zählt die statische Eigenschaft noOfWin die Anzahl der Window-Objekte. Selbstverständlich sollte in der Praxis dieser Zähler nicht public sein. Dies dient lediglich zur Demonstration des direkten Zugriffs auf eine statische Eigenschaft.

Ein weiterer Anwendungsfall für eine statische Eigenschaft ist die Definition eines Feldes mit einer festen Größe. Soll die Feldgröße über eine Konstante bestimmt werden, ist diese Konstante als statische Eigenschaft zu definieren.

1: class Any
2: {
3:    static const unsigned int SIZE{10};
4:    int field[SIZE];
5:    ...
6: };

Der Grund hierfür ist, dass einer Konstante ansonsten im Konstruktor per Initialisiererliste explizit ein Wert zugewiesen werden kann und damit die Feldgröße von Objekt zu Objekt unterschiedlich wäre.

Statische Methoden

Statische Methoden werden eingesetzt, um statische Eigenschaften ohne Objektbezug bearbeiten zu können.

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

1: // Klassendefinition
2: class Window
3: {
4:    inline static short noOfWin{0}; // Statische Eigenschaft
5: public:
6:    static short GetNoOfWin();     // Statische Methode
7: };
8: // Definition der statischen Methode

9:  short Window::GetNoOfWin()
10: {
11:    return noOfWin;
12: }

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

  • Entweder durch sich selbst (rekursive Methode!),
  • oder ohne Bezug auf ein Objekt, indem beim Aufruf vor dem Namen der Methode der Klassenname gestellt wird,
  • oder in Verbindung mit einem beliebigen Objekt.

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

1: // Klassendefinition
2: class Window
3: {
4:    inline static short noOfWin{0}; // Statische Eigenschaft
5: public:
6:   static short GetNoOfWin()       // Statische Methode
7:   {
8:      return noOfWin;
9:   }
10: };
11:
12: // main() Funktion
13: int main()
14: {
15:    Window myWin;
16:    short winCount;
17:    ...
18:    winCount = Window::GetNoOfWin();   // Direkter Aufruf
19:    winCount = myWin.GetNoOfWin();     // Aufruf über ein Objekt
20:    ...
21: }

Statische Methoden besitzen eine Reihe von Einschränkungen:

  • Sie haben nur Zugriff auf die statischen Member der Klasse.
  • Statische Methode erhalten keinen this-Zeiger (wird im nächsten Kapitel gleich erklärt).
  • Es darf keine statische und nicht-statische Methode mit der gleichen Signatur geben.
  • Statische Methoden können nicht virtuell sein (auch das wird später noch erklärt).
  • Statische Methoden können nicht const oder volatile sein.

Copyright 2024 © Wolfgang Schröder
E-Mail mit Fragen oder Kommentaren zu dieser Website an: info@cpp-tutor.de
Impressum & Datenschutz