2.1 Was ist eine Klasse?
Eine Klasse ist ein abstrakter Datentyp wie zum Beispiel Geschäftspartner, Material oder Transaktion. Sie enthält Attribute und Methoden.
Die Deklaration einer Klasse in C++ ähnelt der einer Struktur und sieht wie folgt aus:
class Person
{
private:
int age;
public:
void setAge(int a);
};
Die Schlüsselwörter "private" und "public" werden später noch erklärt.
Attribute beschreiben die Struktur einer Klasse oder vereinfacht ausgedrückt, die Daten. Methoden beschreiben das Verhalten einer Klasse. Mit Hilfe dieser werden Operationen, Dienste und Funktionen angeboten. Eine Methode wird in C++ nicht wie in C durch ihren Namen eindeutig identifiziert, sondern durch ihren Prototyp.
2.2 Was ist ein Objekt?
Objekte sind Instanzen (oder Ausprägungen) einer Klasse. Vereinfacht ausgedrückt: Man kann eine Klasse in etwa als Datentyp ansehen und ein Objekt als zugehörige Variable dieses Datentyps. Der Unterschied ist der, daß ein Objekt auch die zugehörigen Methoden umfaßt.
Wenn es nun zwei Objekte namens "Müller" und "Huber" der Klasse "Geschäftspartner" gibt, sind die Daten in diesen Objekten zwar unterschiedlich, aber die Methoden sind exakt die gleichen.
2.3 Konstruktoren
Konstruktoren sind Methoden, die automatisch bei der Erzeugung eines Objekts ablaufen und haben immer den gleichen Namen wie die Klasse. Eine Klasse hat immer einen Konstruktor (Default Konstruktor), man kann aber mehrere Konstruktoren schreiben, die verschiedene Aufgaben erfüllen. Einsatzgebiete für Konstruktoren sind:
Initialisierung einer Klasse durch parametrisierte Konstruktoren
Bereitstellen von dynamischem Speicherplatz
Copy Konstruktor
Copy Konstruktor
Wenn ein Objekt dynamisch Speicher anlegt und man eine Initialisierung dieses Objekts anhand eines typgleichen Objektes durchführen will, folgt daraus das Problem, daß beide Objekte auf denselben Speicherbereich zugreifen, wobei aber die beiden Objekte lediglich die gleichen Inhalte haben sollten.
Das gleiche Problem tritt bei zwei weiteren Fällen auf. Zum einen, wenn ein Objekt als Argument an eine Funktion übergeben wird um zum anderen, wenn ein Objekt ein Rückgabewert einer Funktion ist. Um dieses Problem zu lösen, bietet C++ den Copy Konstruktor. Ein Copy Konstruktor sieht folgendermaßen aus:
(const &o)
{
// Eigenlicher Code des Konstruktors
}
Das folgende Beispiel beinhaltet alle 3 möglichen Varianten eines Konstruktors:
class array
{
int *p;
int size;
public:
// normaler constructor
array (int sz)
{
p = new int [sz];
if (!p) exit (1);
size = sz;
}
// copy constructor
array (array &a)
{
int i;
p = new int[a.size];
if (!p) exit (1);
for (i = 0; i < a.size; i++) p[i] = a.p[i];
size = a.size;
}
~array() { delete [] p; }; //Destructor
};
2.4 Destruktor
Destruktoren sind Methoden, die bei der Zerstörung eines Objekts automatisch aufgerufen werden und werden z.B. zum Freigeben von dynamisch allokierten Speicher oder zum Schließen einer Datei verwendet. Ein Destruktor sieht folgendermaßen aus:
~()
{
//eigentlicher Code
}
2.5 Membervariablen und -funktionen
2.5.1 Statische Membervariablen
Wenn eine Membervariable einer Klasse als static deklariert wird, haben alle Objekte dieser Klasse Zugriff auf die gleiche Variable, da sie nur einmal im Speicher existiert. Weiters muß noch eine globale Definition für die Variable gemacht werden, da die Deklaration in der Klasse noch keinen Speicherplatz allokiert. Das folgende Beispiel veranschaulicht den Vorgang:
class shared
{
public:
static int a; // Deklaration von a
};
int shared::a; // globale Definition von a
main()
{
// Initialisierung, bevor ein Objekt existiert
shared::a = 99;
cout |