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.