Studenten wurden als public klassifiziert,
d.h., jeder kann auf diese Daten zugreifen, wie mittels
mike.pvorname .
Um diese Daten vor unerwünschtem Zugriff zu schützen und um das
Datenlayout evtl. nachträglich ändern zu können,
kapselt man die Daten so in die Klasse ein, daß sie nur noch
über Zugriffsmethoden erreichbar sind. Die diesbezügliche Klassifikation
wird durch das Schlüsselwort private angegeben.
Damit ändert sich der Deklarationsteil der Klasse Studenten
in
// studenten2.hh
#include <iostream.h>
class Studenten
{
// Data in Studenten are private now!!
private:
long int matrikel;
int skz;
char *pname, *pvorname;
// Methods in Studenten
public:
// Constructors, Destructor, Access operator
...
// Output operator
friend ostream & operator<<(ostream & s, const Studenten & orig);
// Methods to access the private data
// Methods for data manipulation in Studenten
void SetVorname(const char vorname[]);
void SetName(const char name[]);
void SetMatrikel(const long int mat_nr);
void SetSKZ(const int skz_nr);
// Methods that don't manipulate data in Studenten
const long int& GetMatrikel() const;
const int& GetSKZ() const;
const char* GetVorname() const;
const char* GetName() const;
};
|
In obigen Methoden sind zwei const Deklarationen zu finden.
Ein const am Ende der Deklarationszeile zeigt an, daß die
Daten in Studenten von der entsprechenden Methode, z.B.,
GetSKZ nicht verändert werden. Das const am Zeilenanfang
gehört zum Ergebnistyp und zeigt an, daß die Daten auf welche mit
der Referenz int& verwiesen wird nicht verändert werden dürfen.
Damit wird gesichert, daß die Daten auch nicht unabsichtlich über
Zeiger oder Referenzen manipuliert werden können.
Die Zugriffsmethoden werden wie folgt definiert:
// studenten2.cc
#include "studenten2.hh"
...
void Studenten :: SetVorname(const char vorname[])
{
if (pvorname != 0) delete [] pvorname;
pvorname = new char[strlen(vorname)+1];
strcpy(pvorname,vorname);
return;
}
void Studenten :: SetSKZ(const int skz_nr)
{
skz = skz_nr;
return;
}
...
const char* Studenten :: GetVorname() const
{
return pvorname;
}
const int& Studenten :: GetSKZ() const
{
return skz;
}
|
Diese neuen Zugriffsmethoden können wie folgt benutzt werden:
// Ex861.cc
#include <iostream.h>
#include <strings.h>
#include "studenten2.hh"
int main()
{
Studenten mike("Arni", "Schwarz", 812, 7938592);
cout << "mike : " << mike << endl;
cout << endl;
// Data in Studenten are private therefore --> inaccessible:
// cout << "Access to public data : ";
// cout << "mike.pvorname = " << mike.pvorname << endl;
// Data in Studenten are private therefore :
cout << "Access to private data via methods: " << endl;
cout << "mike.pvorname = " << mike.GetVorname() << endl;
// mike.GetVorname()[3] = 'k'; // not allowed because of 'const'
// char *pp = mike.GetVorname();// not allowed because of 'const'
char tmp[40];
strcpy(tmp,mike.GetVorname()); // allowed
return 0;
}
|
Einige Zugriffsfunktionen, z.B., SetSKZ und
GetSKZ sind so kurz, daß sich ein Funktionsaufruf
wegen des Aufwandes der Parameterübergabe eigentlich
nicht lohnt. In diesem Falle werden Deklaration und
Definition einer Methode miteinander im Headerfile verknüpft,
die Methode/Funktion wird inline definiert.
Diese inline-Zeilen ersetzen jedesmal den Funktionsaufruf.
// studenten3.hh
#include <iostream.h>
class Studenten
{
...
void SetSKZ(const int skz_nr)
{ skz = skz_nr; }; // inline function
...
const int& GetSKZ() const
{ return skz; }; // inline function
};
|