Manchmal kann es sinnvoll sein, eine Variable zu haben, die für alle Instanzen einer Klasse nur einmal existiert. Ähnlich wie in C, wo man Variablen innerhalb von Funktionen mithilfe von static deklarieren konnte. Der Sichtbarkeitsbereich war dann zwar auf die Funktion beschränkt, sie verhielten sich jedoch wie globale Variablen, d.h. sie wurden nur einmal initialisiert und behielten über Funktionsaufrufe hinweg ihren Wert.
In C++ können Member-Variablen ein ähnliches Verhalten zeigen.
Deklaration:
class CVector { private: static int instances; // instance-counter static double epsilon; // zero-vector tolerance ... public: void GetInstances() const; // returns instances void SetEpsilon(double eps); // sets new tolerance ... }
Implementierung:
int CVector::instances=0; double CVector::epsilon =1E-15; void CVector::GetInstances( ) const { return(instances); } void CVector::SetEpsilon( double eps ) { epsilon=fabs(eps); }
Erhöhen wir nun in den Konstruktoren instances, und erniedrigen wir es im Destruktor, so können wir mitzählen, wieviele Objekte CVector z.Z. im Programm definiert sind und z.B. folgendes Programmsegment schreiben:
... CVector *v; v = new CVector[17]; cout << (*v).GetInstances() << endl; ...
Im obigen Vektorfeld können wir übrigens die dritte Komponente des sechsten Vektors wie folgt setzen:
v[5][2]=2.0;