C++-Programmierung/ Im Zusammenhang mit Klassen/ Statische Membervariablen

Aus Wikibooks
Zur Navigation springen Zur Suche springen

Gleich zu Beginn: C++ kennt im Unterschied zu anderen Programmiersprachen, wie z.B. C#, keine statische Klassen![1] Dafür kann eine Klasse aber statische Inhalte haben, die im gleichen Ausführungsobjekt

  • in allen Instanzen dieser Klasse gleich sind und
  • auch verfügbar sind, wenn keine Instanz der Klasse existiert.

Dies gilt auch für statische Mitgliedsvariablen.

Eine statische Variable wird mit dem Speicherklassenschlüsselwort static deklariert. Variablen der Speicherklasse static sind nur in dem Objektcode gültig, in dem sie definiert sind. Um dieses Verhalten bei einer Mitgliedsvariable in einer Klasse zu erreichen, muss neben der Deklaration in der Klasse eine Definition dieser Variable im Ausführungsobjekt der Klasse, außerhalb der Deklaration, erfolgen. Bei konstanten, statischen Mitgliedsvariablen genügt die Deklaration, Definition und Initialisierung innerhalb der Klassendeklaration.

Nuvola-inspired-terminal.svg
1 class mitStatischemInhalt{
2 public:
3 	static int x;
4 };
5 
6 int mitStatischemInhalt::x;

Die Klasse mitStatischemInhalt hat nun eine statische Mitgliedsvariable x, die in allen Instanzen der Klasse und auch ohne Instanzierung über mitStatischemInhalt::x erreichbar ist, und sich auf die eine Definition int mitStatischemInhalt::x; bezieht.

Referenzen[Bearbeiten]

  1. benediktibk. “C++: statische Klasse vs. Namesbereich”. Hackerboard.de, 2007.
Symbol opinion vote.svg
Hinweis

Bitte beachten Sie bei diesem Vorgehen, dass die Speicherklasse static festlegt, dass die statischen Inhalte einer Klasse nur in dem Modul gültig sind, in dem sie definiert wurden. Ein externer Zugriff auf diese Variable ist nicht möglich.

Beispiel: Für ein modular aufgebautes Programm werden erst zwei getrennte Bibliotheken A und B erzeugt, die am Ende zum Hauptprogramm hinzugelinkt werden. Beide verwenden die Klasse C mit der statischen Member-Variable _sm. Dann gibt es in Bibliothek A ein C::_sm, jedoch ein anderes C::_sm in Bibliothek B. Beim Datenaustausch eines C-Objekts zwischen den Bibliotheken kann sich somit _sm scheinbar ändern.