Datenelemente und Member-Funktionen einer Klasse können in einer von
drei Typen von Sektionen (public
, private
oder
protected
) des Klassenkörpers spezifiziert werden.
Diese Sektionen
werden durch das jeweilige Schlüsselwort, gefolgt von einem
Doppelpunkt eingeleitet und können beliebig häufig durch die Angabe eines
anderen Zugriffsstatus ``umgeschaltet'' werden. Der
Status public
ist default in C-typischen Strukturen, die durch
struct
definiert werden. Er bedeutet, dass alle Datenelemente
des Aggregates frei zugänglich sind und aus beliebigen Funktionen
heraus verwendet werden dürfen. Dagegen bedeutet eine Deklaration in
der private
-Sektion, daß ausschließlich Elementfunktionen
der Klasse selbst Zugriff auf diese Daten haben. Das private
Verhalten ist der Default in durch class
eingeleiteten
Klassendeklarationen.
Die Verwendung dieser Schlüsselwörter erlaubt dem Programmierer,
die zur Repräsentation der Klasse
nötigen Daten vor dem Anwender zu ``verstecken'' und zu verhindern,
dass solche Daten direkt, ohne Vermittlung von Elementfunktionen,
manipuliert oder gelesen werden können. Es kann daher nicht zu
unerwünschten Wechselwirkungen zwischen Programmteilen aufgrund einer
Änderung der inneren Repräsentation der Klasse oder durch inkonsistent
genutzte Datenelemente kommen. Die Lösung
eines Jahr-2000-Problem bedeutet
für ein objektorientiertes Programm die Änderung der inneren
Repräsentation des Datums (beispielsweise der Jahreszahl
durch einen long int
statt durch zwei char
,
aber keine verzweifelte Suche nach Programmteilen, die sich auf diese
zwei char
als Repräsentation verlassen haben. In einem solchen
Programm muss nur die Datumsklasse neu kompiliert werden, der übrige
Programmcode bleibt völlig unbeeinflusst!
Als Beipiel der späteren möglichen Änderung
einer Repräsentation ziehen wir das Beipiel unserer Person
heran.
Hier könnten wir uns überlegen, vielleicht aufgrund einer häufig
nötigen getrennten Nutzung des Vor- und Nachnamens, den Namen nicht
als eine, sondern als zwei getrennte Zeichenketten zu speichen. Die
Auftrennung erfolgt in Konstruktor und in set_name()
ohne dass
die Benutzung der Klasse sich ändert.
Person.h: class Person { public: // start public section // ctor's are generally public, apart from some exceptional cases that // might want to hide the copy ctor in the private section // Person(){} // Person(const Person &rhs){} Person(std::string a_name, Datum a_birthday); Datum birthday() const; // compute birthday std::string first_name() const; // get first name std::string surname() const; // get surname void set_name(); // changes name (marriage, ...) private: // switch to private section, data members most // of the time private Datum birthday; std::string my_surname; std::string my_firstname; }; Person.cc: void Person::set_name( std::string a_name ){ // separate first and surname my_surname = ...; my_firstname = ...; } Person::Person(std::string name, Datum a_birthday ) { birthday=a_birthday; set_name(name); // calls member function to split the names } // ...
Als Faustregel sollten Datenelemente immer private
deklariert
sein. Wird ein schneller Zugriff auf ein solches Element gewünscht, so
sollte man sich mit einer inline
deklarierten bzw. im
Klassenkörper definierten Elementfunktion behelfen, die den Wert des
Elementes zurückliefert. Dies hält die Option offen, die
Implementierung zu einem späteren Zeitpunkt doch noch zu
ändern. Sollte ein Anwender der Klasse erst einmal
public
-deklarierte Daten benutzen (insbesondere schreiben),
dann gibt es meist kein Zurück mehr.
Funktionen, die die Schnittstelle der Klasse zur Außenwelt
darstellen, gehören in die public
Sektion. Hilfsfunktionen,
die bestimmte interne Operationen durchführen und dazu wieder von
Elementfunktionen aufgerufen werden, sollten in der
private
-Sektion deklariert sein, oder, wenn sie auch für die
Benutzung durch abgeleitete Klassen sinnvoll sind, durch
protected
geschützt.