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

Aus Wikibooks


Statische Inhalte einer Klasse sind im gleichen Ausführungsobjekt

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

Eine statische Methode wird mit dem Speicherklassenschlüsselwort static deklariert.

Dies gilt auch für statische Mitgliedsmethoden.

Im aktuellen Abschnitt ist mit statische Methode immer eine statische Mitglieds-Methode einer Klasse gemeint.

Statische Methoden können auf statische Mitglieder der Klasse, in der sie deklariert werden, zugreifen. Nicht-statische Inhalte dürfen nicht von der Methode aus verwendet werden, da die Methode auch ohne eine Instanz gültig ist. Auch wenn ein Objekt verwendet wird und über das Objekt die statische Methode aufgerufen wird, wird der statische Programmcode verwendet.

Im Beispiel wird nun eine statische Methode deklariert und in einer Beispielfunktion dreimal verwendet. Beachten Sie, dass die Zuweisungen von p1, p2, p3 immer dieselbe statische Funktion aufrufen.

class Q{
public:
  static char *gibVierKiloByte(void);
};

void f( Q &rQ, Q *pQ ){
  char *p1 = Q::gibVierKiloByte(); // Aufruf ohne Objekt
  char *p2 = rQ.gibVierKiloByte(); // Aufruf über referenziertes Objekt
  char *p3 = pQ->gibVierKiloByte(); // Aufruf über Zeiger auf Objekt
};

Die zweite und dritte Aufruf-Variante sollte vermieden werden, da man sie als Andeutung verstehen könnte, dass hier eine nicht-statische Methode aufgerufen würde.


Ein weiteres Beispiel, welches zeigt wie man statische Membermethoden und Membervariablen dazu verwenden könnte, um die Anzahl der erzeugten Instanzen/Objekte der Klasse zu bestimmen:

#include <iostream>
using namespace std;


class Tier{
public:
    Tier();
    static int getAnzahl();
    // statische Membermethode kann auf nur
    // statische Membervariablen zugreifen

private:
    static int anz;
};


// Initialisierung der statischen Membervariablen
int Tier::anz = 0;

Tier::Tier(){
    ++ anz;
}

int Tier::getAnzahl(){
    return anz;
}

int main(){
    // Selbst wenn noch keine Instanzen auf
    // Klasse Tier sind kann man schon
    // die statische Membermethode aufrufen
    cout << Tier::getAnzahl() << endl;

    Tier t1;
    cout << Tier::getAnzahl() << endl;

    Tier t2, t3;
    cout << Tier::getAnzahl() << endl;

    cin.peek();
}
Ausgabe:
0
1
3