Wenn eine Methode in einer Klasse als static deklariert wurde, dann besitzt sie keinen this Zeiger. Dies führt dazu, dass man static Methoden ohne ein Objekt zu haben aufrufen kann (denn der this-Zeiger repräsentiert ja das Objekt).
#include <iostream>
using namespace std;
class Test
{
public:
static void print()
{
cout<<"Test::print()\n";
}
};
int main()
{
//Test t;
//t.print(); //geht nicht
Test::print(); //so ist es richtig
}
Es gibt auch static Membervariablen. Diese Variablen sind für alle Objekte gleich - sie alle Teilen sich eine Membervariable.
#include <iostream>
using namespace std;
class Counter
{
private:
static int count;
public:
static int getCount()
{
return count;
}
Counter()
{
++count;
}
~Counter()
{
--count;
}
};
int Counter::count = 0; //wichtig!
//static Variablen müssen extra definiert werden
int main()
{
Counter a, b;
cout<<"Es existieren "<<Counter::getCount()<<" Objekte\n";
{
Counter c, d;
cout<<"Es existieren "<<Counter::getCount()<<" Objekte\n";
{
Counter e, f;
cout<<"Es existieren "<<Counter::getCount()<<" Objekte\n";
}
cout<<"Es existieren "<<Counter::getCount()<<" Objekte\n";
}
cout<<"Es existieren "<<Counter::getCount()<<" Objekte\n";
}
Static Variablen muss extra definieren. Denn innerhalb der Klassendefinition wird die static Variable nur deklariert. Bei 'normalen' Variablen findet die Definition bei der Instanziierung statt. Bei static Variablen muss die Definition natürlich extra erfolgen. Am besten in einer eigenen Übersetzungseinheit um die ODR nicht zu verletzen.