const-Methoden

Wenn eine Methode die Elemente der Klasse nur lesend anfaßt, dann kann und sollte sie als const deklariert werden; dies geschieht durch die Angabe des Schlüsselworts const hinter der schließenden Klammer der Parameterliste:
class A
{
private:

  int i;

public:

  int get_i() const { return i; }
  // ...
};

Damit garantiert man, daß der Zustand eines Objekts durch den Aufruf der Methode nicht geändert wird.

Dies ist zum einen praktisch, weil der Compiler eine versehentliche Änderung eines Elements als Fehler erkennen kann:

  // ...
  int get_i() const { return i++; }  // Fehlermeldung!
  // ...
};

Zum anderen sind nur als const deklarierte Funktionen anwendbar, wenn ein konkretes Objekt als const deklariert ist:

void up( const A parameter )
{
  cout << parameter.get_i() << endl;
}

Da hier parameter als const angegeben ist, dürfen nur Methoden darauf angewendet werden, die ebenfalls durch const versichern, den Zustand von parameter nicht zu ändern.

Eine const-Methode kann sowohl auf const-Objekte als auch auf nicht-const-Objekte angewendet werden; eine nicht-const-Methode dagegen nur auf nicht-const-Objekte.

Ob eine Methode als const deklariert ist oder nicht, ist Teil ihrer Signatur, die sie von anderen überladenen Methoden unterscheidet. Deshalb kann man zwei sonst identische überladene Methoden definieren, die sich nur bezüglich const unterscheiden.

Da sich durch const eine andere Funktion ergibt, muß man bei einer Definition außerhalb der Klasse dort das Schlüsselwort const wiederholen:

class A
{
private:

  int i;

public:

  int get_i() const;
  // ...
};

int A::get_i() const { return i; }

Soweit die Theorie. Manchmal kommt es aber vor, daß man eine Funktion als const deklarieren möchte, um sie auf const-Elemente anwenden zu dürfen, aber die Funktion ändert tatsächlich ein Element des Objekts oder einige wenige, ohne daß sich der Zustand des Objekts aus der Sicht des Anwenders ändert (beispielsweise soll ein Zugriffszähler weitergesetzt werden). In diesem Fall ist das Objekt nicht physisch konstant; es ist aber aus der Sicht des Anwenders logisch konstant. Dann kann man die zu ändernden Elemente der Klasse als mutable deklarieren. Das bedeutet, daß diese Elemente auch bei const-Objekten nicht wirklich konstant sein müssen, sondern auch von const-Methoden geändert werden dürfen. (Eine Alternative zu dieser Vorgehensweise wäre, einen Datentyp zu schaffen, in dem alle veränderlichen Bestandteile enthalten sind, und in dem möglicherweise konstanten Objekt einen Zeiger auf den veränderlichen Teil zu hinterlegen, der im Konstruktor allokiert und im Destruktor freigegeben wird.)

AnyWare@Wachtler.de