Neu in C++ gegenüber C ist, dass Elementfunktionen (oder Methoden, englisch ``member functions'') einer Struktur/Klasse erklären kann, die privilegierten Zugriff auf deren Datenelemente genießen. Zum Beispiel ließe sich die obige Struktur durch spezielle Funktionen zur Berechnung des Geburtstages oder der getrennten Ausgabe von Vor- und Nachnamen der Person erweitern:
class Person { public: // member functions Datum birthday() const; // compute birthday std::string first_name() const; // get first name std::string surname() const; // get surname void set_name(std::string name); // changes name (marriage, ...) // data int age; Datum birthday; std::string name; // C++ standard library class };Im obigen Beispiel deutet
Datum
eine weitere
benutzerdefinierte Klasse an, die in der Lage ist, ein bestimmtes
Datum zu repräsentieren.
Das const
hinter der Argumentliste der gewöhnlichen
Elementfunktionen deutet an, daß diese nur lesend auf Datenelemente
der Klasse zugreifen und die Klassenvariablen somit unverändert lassen.
Dies erlaubt dem Compiler, gewisse Optimierungen vorzunehmen.
Wichtig ist außerdem, dass auf Instanzen einer Klasse, die als
const
vereinbart wurden, nur konstante Elementfunktionen
Anwendung finden können. Man sollte also, wo möglich, den ausschliesslich
lesenden Zugriff einer Funktion mit const
für den Compiler
kennzeichnen.
Die Definition von Elementfunktionen erfolgt üblicherweise in der Implementierungsdatei,
Person.cc: Datum Person::birthday() const { return current_date() - age; } std::string Person::first_name() const { // copy name, then find first segment terminated // by a whitespace character } std::string Person::surname() const { // ... } void Person::set_name(std::string name){ this->name = name; // assigns argument 'name' to // member variable name }oder in Ausnahmefällen im Klassenkörper selbst. Diese Funktionen sind dann
inline
, auch wenn sie nicht explizit so gekennzeichnet
sind.
Der Bezugsrahmen(scope)-Operator ::
identifiziert die Elementfunktionen als zugehörig
zur Klasse (Person
). Er muss an dieser Stelle verwendet werden,
weil Funktionen gleichen Namens mit gleichen Argumenten auch in
anderen Klassen auftreten dürfen.
Auf die Datenelemente der Klasseninstanz wird mit den in der
Klassendeklaration verwandten Namen zugegriffen ohne dass dazu die
Operatoren .
oder ->
benötigt werden.