next up previous contents
Next: Ein- und Ausgabe Up: Klassen Previous: Kopieren und Zuweisung von


Zugriffsprivilegien: private, public

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.


next up previous contents
Next: Ein- und Ausgabe Up: Klassen Previous: Kopieren und Zuweisung von
© R.Hilfer et al., ICA-1, Univ. Stuttgart
28.6.2002