Membervariablen & Methoden

Eine Membervariable ist einer normalen Variable sehr ähnlich, nur ist ihr Scope ihre Klasse. In jeder Methode (außer statischen) und Konstruktor/Destruktor kann man auf sie zugreifen. Eine Membervariable sollte in der Initialisierungsliste des Konstruktors initialisiert werden.
Eine Sonderrolle spielen statische Membervariablen und Methoden, am Ende des Kapitels komme ich darauf zurück.
Bei Methoden gibt es einige Unterschiede zu Funktionen, grundsätzlich ist eine Methode als Memberfunktion einer Klasse anzusehen, und die Syntax ist hier auch nicht anders, aber etwas ergänzt:
int getDummy()const;
void setDummy(int d);


Als Beispiel eine Getter Methode  und eine Setter-Methode. Neu ist hierbei das const welches hinter der getDummy Methode steht. Dies ist ein sogenannter const-Qualifier, und sagt dem Compiler, das diese Methode aus auch von einem Konstanten Member aufgerufen werden darf. Die Methode darf dafür auch keine Änderungen an der Klasse vornehmen, und nur ebenfalls als const markierte Methoden aufrufen. Ein Aufruf von setDummy in getDummy würde zu einem Compilerfehler führen.
Die Implementation in der .cpp Datei ist dann sehr ähnlich:
int MyClass::getDummy()const
{
    return dummy;
}
void MyClass::setDummy(int d)
{
    this->dummy = d;
}


Neu ist  hierbei nun der this Zeiger, welcher immer auf die aktuelle Instanz zeigt. Es ist nicht nötig ihn für den Zugriff auf Membervariablen oder Methoden zu nutzen, kann aber Klarheit schaffen. Gerade bei Membervariablen ist es so, das eine an die Methode übergebener Parameter mit gleichem Namen diese überdeckt. Außerdem eignet sich this dazu, an andere Klassen und Funktionen einen Pointer der aktuellen Instanz zu übergeben.
Wie bereits beim Assignment Operator gesehen, kann man für Klassen in C++ entsprechend Operatoren überladen, dies erfolgt als Methode, manche Operatoren lassen sich aber auch als freie Funktion für eine Klasse implementieren. Der operator= sollte stehts eine Methode sein, während der operator== als freie Funktion implementierbar ist:
//Deklaration im Header der Klasse
friend bool operator==(const MyClass& lhv, const MyClass rhv);

//implementation .cpp
bool operator==(const MyClass& lhv, const MyClass rhv)
{
   return lhv.m_dummy == rhv.m_dummy;
}


Was ist der Vorteil manche Operatoren als freie Funktion zu implementieren? Dies hängt unter anderem mit der impliziten Typumwandlung zusammen, hat eine Klasse einen Konstruktor oder einen Assignment Operator, welcher zum Beispiel einen int nimmt, so könnte man in unserem Beispiel 5 == dummy_instanz schreiben. Die 5 Würde für den Operatoraufruf in ein temporäres Dummy Objekt verwandelt, und dort verglichen werden. Bei einer Methode würde dies nicht gehen, da es hier nur ein Argument gibt, welches Übergeben wird. Es ginge also dummy_instanz == dummy_instanz_b und dummy_instanz == 5. Aber nicht 5 == dummy_instanz.

Statische Member

Wie schon erwähnt gibt es statische Membervariablen und Methoden, welches bedeutet das diese unabhängig von einer Instanz existieren. Bei einer Methode muss nur das Schlüsselwort static vor die Deklaration und Definition gestellt werden, schon ist die Methode eine statische. Ähnlich ist dies bei statischen Membervariablen, allerding müssen diese noch in der .cpp datei initialisiert werden:
//Beispiel static header
static int counter;
// Initialisierung in .cpp Datei
int MyClass::counter =0;

static int getCounter()const
{
    return counter;
}


In einer statischen Methode hat man keinen Zugriff auf nicht statische Membervariablen, da es ja keine zugehörige Instanz gibt, daher gibt es dort auch keinen this Zeiger. Ein Aufruf einer statischen Methode kann dann über den Klassennamen mit Scopeoperator erfolgen: MyClass::getCounter().