Statische Member (C++)

Klassen können statische Memberdaten und Memberfunktionen enthalten. Wenn ein Datenmememm als staticdeklariert wird, wird nur eine Kopie der Daten für alle Objekte der Klasse Standard gespeichert.

Statische Datenmember sind nicht Teil von Objekten eines angegebenen Klassentyps. Daher gilt die Deklaration eines statischen Datenmembers nicht als eine Definition. Der Datenmember wird im Klassenbereich deklariert, die Definition wird jedoch im Dateigültigkeitsbereich ausgeführt. Diese statischen Member verfügen über eine externe Bindung. Das folgende Beispiel veranschaulicht dies:

// static_data_members.cpp
class BufferedOutput
{
public:
   // Return number of bytes written by any object of this class.
   short BytesWritten()
   {
      return bytecount;
   }

   // Reset the counter.
   static void ResetCount()
   {
      bytecount = 0;
   }

   // Static member declaration.
   static long bytecount;
};

// Define bytecount in file scope.
long BufferedOutput::bytecount;

int main()
{
}

Im vorangehenden Code ist der bytecount-Member in der BufferedOutput-Klasse deklariert, muss aber außerhalb der Klassendeklaration definiert sein.

Auf statische Datenmember kann verwiesen werden, ohne dass auf ein Klassentypobjekt verwiesen wird. Die Anzahl von Bytes, die mithilfe von BufferedOutput-Objekten geschrieben wurden, kann wie folgt abgerufen werden:

long nBytes = BufferedOutput::bytecount;

Damit der statische Member vorhanden sein kann, ist es nicht notwendig, dass Klassentypobjekte vorhanden sind. Statische Member können auch über die Operatoren "Memberauswahl" (. und ->) zugegriffen werden. Beispiel:

BufferedOutput Console;

long nBytes = Console.bytecount;

Im vorangegangenen Fall wird der Verweis auf das Objekt (Console) nicht ausgewertet. Der zurückgegebene Wert ist der des statischen bytecount-Objekts.

Statische Datenmember unterliegen Klassenmember-Zugriffsregeln, sodass ein privater Zugriff auf statische Datenmember nur für Klassenmemberfunktionen und "Friends" zulässig ist. Diese Regeln werden in der Member-Access-Steuerung beschrieben. Die Ausnahme besteht darin, dass statische Datenmember im Dateibereich definiert werden müssen, ungeachtet ihrer Zugriffseinschränkungen. Wenn der Datenmember explizit initialisiert werden soll, muss ein Initialisierer mit der Definition bereitgestellt werden.

Der Typ eines statischen Members wird nicht durch seinen Klassennamen qualifiziert. Daher lautet longder Typ von BufferedOutput::bytecount .

Siehe auch

Klassen und Strukturen