Statische Eigenschaften sind Eigenschaften, die für alle Objekte einer Klasse nur einmal vorhanden sind.
Eine statische Eigenschaft wird innerhalb der Klasse durch voranstellen der Schlüsselwörter inline static vor dem Datentyp der Eigenschaft definiert.
class Object
{
...
public:
// Statische public-Eigenschaft
inline static int counter = 0;
};
Der Zugriff aus Memberfunktionen heraus auf die statische Eigenschaft erfolgt wie gewohnt.
Ist die statische Eigenschaft public, kann auch außerhalb von Memberfunktionen darauf zugegriffen werden. Dazu ist entweder vor dem Eigenschaftsnamen der Klassenname anzugeben oder ein beliebiges Objekt der Klasse.
#include <iostream>
#include <format>
class Object
{
public:
// ctor
Object()
{
counter++; // Statische Eigenschaft inkrementieren
}
// Statische public-Eigenschaft
inline static int counter = 0;
};
int main()
{
// Zwei Objekte definieren
Object obj1;
Object obj2;
// Direkter Zugriff auf statische Eigenschaft
std::cout << std::format("Es wurden {} Objekte definiert.\n",Object::counter);
// Noch ein Objekt definieren
Object obj3;
// Zugriff auf statische Eigenschaft ueber
// ein beliebiges Objekt
std::cout << std::format("Es wurden {} Objekte definiert.\n",obj2.counter);
}
Und genauso wie es statische Eigenschaften gibt, gibt es auch statische Memberfunktionen. Auch auf sie kann, im Gegensatz zu 'normalen' Memberfunktionen, ohne die Definition eines Objekts durch Angabe des Klassennamens zugegriffen werden. Statische Memberfunktionen haben nur Zugriff auf statische Eigenschaften und statische Memberfunktionen.
Eine Memberfunktion wird zu einer statischen Memberfunktion, indem vor dem Returntyp der Memberfunktion das Schlüsselwort static gestellt wird. Wird die statische Memberfunktion außerhalb der Klasse definiert, darf bei der Definition das Schlüsselwort static nicht mehr mit angegeben werden.
class Object
{
...
public:
static int GetInt(); // Statische Memberfunktion
};
#include <iostream>
#include <format>
class Object
{
int number; // Objektnummer
inline static int counter = 0; // Zaehler als statische Eigenschaft
public:
// ctor
Object()
{
// Objektnummer ablegen und Anzahl der
// erstellten Objekte erhoehen
number = ++counter;
}
// Liefert Objektnummer zurueck
int GetNumber()
{
return number;
}
// Statische Memberfunktion, liefert Anzahl
// der erstellten Objekte zurueck
static int GetCounter()
{
return counter;
}
};
int main()
{
// Direkter Zugriff auf statische Memberfunktion
std::cout << std::format("Es wurden {} Objekte definiert.\n",Object::GetCounter());
// Zwei Objekte definieren
Object obj1;
Object obj2;
// Direkter Zugriff auf statische Memberfunktion
std::cout << std::format("Es wurden {} Objekte definiert.\n",Object::GetCounter());
// Noch ein Objekt definieren
Object obj3;
// Zugriff auf statische Memberfunktion ueber
// ein beliebiges Objekt
std::cout << std::format("Es wurden {} Objekte definiert.\n",obj2.GetCounter());
// Objektnummer von obj2 ausgeben
std::cout << std::format("obj2 ist Objekt Nummer {}\n",obj2.GetNumber());
}