Revision history for ObjProg02Kapselung
Additions:
CategoryObjektorientierteProgrammierung
Deletions:
Additions:
CategoryDelete
Deletions:
Additions:
===Aufruf von Konstruktor und Destruktor===
Deletions:
Additions:
===Konstruktoren===
Ein Konstruktor ist eine spezielle Methode für die Initialisierung des neu angelegten Objektes.
**Besonderheiten**:
1. Der Name des Konstruktors ist gleich dem Namen der Klasse.
2. Ein Konstruktor besitzt keinen Rückgabetyp, auch nicht void.
3. Die Konstruktoren sind überladbar. Eine Klasse kann mehrere Konstruktoren mit der unterschiedlichen Signatur besitzen.
4. Einer der Konstruktoren wird bei der Definition eines Objektes implizit ausgeführt.
5. Ein Konstruktor ohne Parameter heißt Default- Konstruktor oder parameterloser Konstruktor.
===Destruktor===
Ein Destruktor ist eine spezielle Methode für den Abbau eines Objektes.
**Besonderheiten**:
1. Der Name des Destruktors besteht aus dem Klassennamen mit führendem ~ („Tilde“)
2. Ein Destruktor besitzt keinen Rückgabetyp, auch nicht void.
3. Ein Destruktor besitzt keine Parameterliste. Jede Klasse hat nur einen Destruktor.
4. Ein Destruktor wird bei den Abbau eines Objektes implizit ausgeführt, z.B. wird ein lokales Objekt am Ende des Blocks abgebaut, in dem es definiert ist.
5. Ein Destruktor muss bestimmte Aktionen vom Konstruktor und von anderen Methoden wieder rückgängig machen, z.B. reservierten Speicherplatz wieder freigeben oder geöffnete Dateien wieder schließen.
===Aufruf von Konstruktor und Destruktor==
**Aufbau und Abbau des Objekts**
{{image class="center" url="oop10.gif" width="500"}}
===Objekt im dynamischen Speicher===
**Aufbau und Abbau des namenlosen Objektes**
{{image class="center" url="oop11.gif" width="500"}}
===Standardmethoden===
In jeder Klasse sind vier Standardmethoden automatisch vorhanden:
1) der Default- Konstruktor,
2) der Destruktor,
3) der Kopier- Konstruktor,
4) der Zuweisungsoperator.
Der Kopier- Konstruktor initialisiert ein Objekt mit einem anderen Objekt desselben Typs. Dabei werden alle Attribute vom Parameter-Objekt in das neu angelegten Objekt bitweise kopiert.
Er wird implizit aufgerufen:
1) bei der Definition von Objekten,
2) bei der Übergabe des Objektes per „call-by-value“,
3) bei der Übergabe des Objektes per „Rückgabe per Wert“.
Der Zuweisungsoperator kopiert alle Attribute eines Objekts in das andere bereits existierende Objekt desselben Typs.
===Standard-Kopier-Konstruktor ===
{{image class="center" url="oop12.gif" width="500"}}
Ein Konstruktor ist eine spezielle Methode für die Initialisierung des neu angelegten Objektes.
**Besonderheiten**:
1. Der Name des Konstruktors ist gleich dem Namen der Klasse.
2. Ein Konstruktor besitzt keinen Rückgabetyp, auch nicht void.
3. Die Konstruktoren sind überladbar. Eine Klasse kann mehrere Konstruktoren mit der unterschiedlichen Signatur besitzen.
4. Einer der Konstruktoren wird bei der Definition eines Objektes implizit ausgeführt.
5. Ein Konstruktor ohne Parameter heißt Default- Konstruktor oder parameterloser Konstruktor.
===Destruktor===
Ein Destruktor ist eine spezielle Methode für den Abbau eines Objektes.
**Besonderheiten**:
1. Der Name des Destruktors besteht aus dem Klassennamen mit führendem ~ („Tilde“)
2. Ein Destruktor besitzt keinen Rückgabetyp, auch nicht void.
3. Ein Destruktor besitzt keine Parameterliste. Jede Klasse hat nur einen Destruktor.
4. Ein Destruktor wird bei den Abbau eines Objektes implizit ausgeführt, z.B. wird ein lokales Objekt am Ende des Blocks abgebaut, in dem es definiert ist.
5. Ein Destruktor muss bestimmte Aktionen vom Konstruktor und von anderen Methoden wieder rückgängig machen, z.B. reservierten Speicherplatz wieder freigeben oder geöffnete Dateien wieder schließen.
===Aufruf von Konstruktor und Destruktor==
**Aufbau und Abbau des Objekts**
{{image class="center" url="oop10.gif" width="500"}}
===Objekt im dynamischen Speicher===
**Aufbau und Abbau des namenlosen Objektes**
{{image class="center" url="oop11.gif" width="500"}}
===Standardmethoden===
In jeder Klasse sind vier Standardmethoden automatisch vorhanden:
1) der Default- Konstruktor,
2) der Destruktor,
3) der Kopier- Konstruktor,
4) der Zuweisungsoperator.
Der Kopier- Konstruktor initialisiert ein Objekt mit einem anderen Objekt desselben Typs. Dabei werden alle Attribute vom Parameter-Objekt in das neu angelegten Objekt bitweise kopiert.
Er wird implizit aufgerufen:
1) bei der Definition von Objekten,
2) bei der Übergabe des Objektes per „call-by-value“,
3) bei der Übergabe des Objektes per „Rückgabe per Wert“.
Der Zuweisungsoperator kopiert alle Attribute eines Objekts in das andere bereits existierende Objekt desselben Typs.
===Standard-Kopier-Konstruktor ===
{{image class="center" url="oop12.gif" width="500"}}
Additions:
{{image class="center" url="oop6.gif" width="450"}}
===Definition von Objekten===
Definition eines Objektes erfolgt durch Angabe des Datentyps und des Objektnamens. Für jedes Objekt wird der Speicherplatz reserviert.
{{image class="center" url="oop7.gif" width="500"}}
===Verwendung von Objekten===
Ein Anwendungsprogramm kann nur auf public- Attribute des Objektes zugreifen und public- Methoden aufrufen. Dies geschieht mit Hilfe des Punktoperators oder des Pfeiloperators.
{{image class="center" url="oop8.gif" width="500"}}
===Der this-Zeiger===
Jede Methode erhält den so genannte this-Zeiger als verstecktes Argument beim Aufruf. Der this-Zeiger enthält die Adresse des
aktuellen Objekts. Die Adresse des Objektes im Speicherbereich ist das Identitätskriterium.
{{image class="center" url="oop9.gif" width="500"}}
=====2.3. Methoden =====
===Definition von Objekten===
Definition eines Objektes erfolgt durch Angabe des Datentyps und des Objektnamens. Für jedes Objekt wird der Speicherplatz reserviert.
{{image class="center" url="oop7.gif" width="500"}}
===Verwendung von Objekten===
Ein Anwendungsprogramm kann nur auf public- Attribute des Objektes zugreifen und public- Methoden aufrufen. Dies geschieht mit Hilfe des Punktoperators oder des Pfeiloperators.
{{image class="center" url="oop8.gif" width="500"}}
===Der this-Zeiger===
Jede Methode erhält den so genannte this-Zeiger als verstecktes Argument beim Aufruf. Der this-Zeiger enthält die Adresse des
aktuellen Objekts. Die Adresse des Objektes im Speicherbereich ist das Identitätskriterium.
{{image class="center" url="oop9.gif" width="500"}}
=====2.3. Methoden =====
Deletions:
Additions:
===Definition von Klassen ===
Definition einer Klasse legt den Namen der Klasse sowie die Namen und Typen von Merkmalen (Klassenelementen, members)
fest. Merkmale sind Attribute (Daten) und Methoden (Elementfunktionen).
Bei der Klassendefinition werden die Attribute nur deklariert, d.h. keine Speicherreservierung.
{{image class="center" url="oop6.gif" width="500"}}
Definition einer Klasse legt den Namen der Klasse sowie die Namen und Typen von Merkmalen (Klassenelementen, members)
fest. Merkmale sind Attribute (Daten) und Methoden (Elementfunktionen).
Bei der Klassendefinition werden die Attribute nur deklariert, d.h. keine Speicherreservierung.
{{image class="center" url="oop6.gif" width="500"}}
Additions:
===Schnittstelle einer Klasse===
===Beispiele für Deklaration, Definition, Verwendung ===
""<table class="data" width="80%" style="border:0">
<tr>
<td>
</td>
<td>
<b>Deklaration </b>
</td>
<td>
<b>Definition </b>
</td>
<td>
<b>Verwendung </b>
</td>
</tr>
<tr>
<td>
<b>Typ
</b>
</td>
<td>
//Vorwärtsdeklaration <br/>
class A;
</td>
<td>
class A{…};
</td>
<td>
A a1, a3;
</td>
</tr>
<tr>
<td>
<b>Variable,
Objekt </b>
</td>
<td>
extern A a1;<br/><br/>
class B <br/>
{ A a1; <br/>
};
</td>
<td>
A a1;
</td>
<td>
// Zugriff<br/>
f(a1); <br/><br/>
a1 = a3;
</td>
</tr>
<tr>
<td>
<b>Funktion,
Methode </b>
</td>
<td>
//Prototyp <br/>
extern void f(A a2); <br/><br/>
class B <br/>
{ void m (A a2); <br/>
};
</td>
<td>
void f(A a2){…}<br/><br/>
void B::m(A a2){…}
</td>
<td>
//Aufruf <br/>
f(a3); <br/><br/>
a1.m(a3);
</td>
</tr>
</table>""
===Beispiele für Deklaration, Definition, Verwendung ===
""<table class="data" width="80%" style="border:0">
<tr>
<td>
</td>
<td>
<b>Deklaration </b>
</td>
<td>
<b>Definition </b>
</td>
<td>
<b>Verwendung </b>
</td>
</tr>
<tr>
<td>
<b>Typ
</b>
</td>
<td>
//Vorwärtsdeklaration <br/>
class A;
</td>
<td>
class A{…};
</td>
<td>
A a1, a3;
</td>
</tr>
<tr>
<td>
<b>Variable,
Objekt </b>
</td>
<td>
extern A a1;<br/><br/>
class B <br/>
{ A a1; <br/>
};
</td>
<td>
A a1;
</td>
<td>
// Zugriff<br/>
f(a1); <br/><br/>
a1 = a3;
</td>
</tr>
<tr>
<td>
<b>Funktion,
Methode </b>
</td>
<td>
//Prototyp <br/>
extern void f(A a2); <br/><br/>
class B <br/>
{ void m (A a2); <br/>
};
</td>
<td>
void f(A a2){…}<br/><br/>
void B::m(A a2){…}
</td>
<td>
//Aufruf <br/>
f(a3); <br/><br/>
a1.m(a3);
</td>
</tr>
</table>""
Deletions:
Additions:
{{image class="center" url="oop3.gif" width="500"}}
===Prozedurale Lösung mit Datenabstraktion ===
{{image class="center" url="oop4.gif" width="500"}}
===Lösung mit Datenabstraktion und Datenkapselung ===
{{image class="center" url="oop5.gif" width="500"}}
===Schnittstelle einer Klasse
Die Deklarationen von allen public- Methoden bilden die öffentliche Schnittstelle (Interface). Durch die öffentliche Schnittstelle kommuniziert ein Objekt mit der Umgebung.
Die Schnittstelle sagt nichts über die Implementierung (über die interne Darstellung der Daten) aus. Die Datenabstraktion realisiert das Prinzip der Trennung von Schnittstelle und Implementierung.
Das Anwendungsprogramm merkt keine Veränderungen in der Implementierung, wenn die Schnittstelle dieselbe bleibt.
===ADT===
Der abstrakten Datentyp (ADT) ist ein Konzept der Entwurfsphase.
Als ADT bezeichnet man spezielle Datentypen:
1) deren Operationen und das korrekten Zusammenspiel der Operationen genau spezifiziert sind,
2) die jedoch nicht an einen konkreten Wertebereich gebunden sind.
Die Spezifikation des ADT kann:
1) durch natürliche Sprache,
2) durch eine Reihe von Axiomen,
3) durch Methodendeklaration mit Kommentaren usw. beschrieben werden.
__Vorsicht__: Ein benutzerdefinierter Typ wird häufig als ADT bezeichnet.
=====2.2. Definition von Klassen und Objekten=====
===Deklaration, Definition und Verwendung===
Eine Deklaration bestimmt, welche Bedeutung ein Bezeichner im Programmtext besitzt.
Jede Definition stellt auch eine Deklaration dar.
Bei der Definition:
1) einer Variable (eines Objektes) wird Speicherplatz reserviert.
2) einer Funktion (Methode) wird der Rumpf festgelegt.
3) eines Typs(Klasse) werden alle Merkmale festgelegt.
Vor der Verwendung muss jede Variable(Objekt), jede Funktion(Methode), jeder Typ(Klasse) definiert werden.
===Prozedurale Lösung mit Datenabstraktion ===
{{image class="center" url="oop4.gif" width="500"}}
===Lösung mit Datenabstraktion und Datenkapselung ===
{{image class="center" url="oop5.gif" width="500"}}
===Schnittstelle einer Klasse
Die Deklarationen von allen public- Methoden bilden die öffentliche Schnittstelle (Interface). Durch die öffentliche Schnittstelle kommuniziert ein Objekt mit der Umgebung.
Die Schnittstelle sagt nichts über die Implementierung (über die interne Darstellung der Daten) aus. Die Datenabstraktion realisiert das Prinzip der Trennung von Schnittstelle und Implementierung.
Das Anwendungsprogramm merkt keine Veränderungen in der Implementierung, wenn die Schnittstelle dieselbe bleibt.
===ADT===
Der abstrakten Datentyp (ADT) ist ein Konzept der Entwurfsphase.
Als ADT bezeichnet man spezielle Datentypen:
1) deren Operationen und das korrekten Zusammenspiel der Operationen genau spezifiziert sind,
2) die jedoch nicht an einen konkreten Wertebereich gebunden sind.
Die Spezifikation des ADT kann:
1) durch natürliche Sprache,
2) durch eine Reihe von Axiomen,
3) durch Methodendeklaration mit Kommentaren usw. beschrieben werden.
__Vorsicht__: Ein benutzerdefinierter Typ wird häufig als ADT bezeichnet.
=====2.2. Definition von Klassen und Objekten=====
===Deklaration, Definition und Verwendung===
Eine Deklaration bestimmt, welche Bedeutung ein Bezeichner im Programmtext besitzt.
Jede Definition stellt auch eine Deklaration dar.
Bei der Definition:
1) einer Variable (eines Objektes) wird Speicherplatz reserviert.
2) einer Funktion (Methode) wird der Rumpf festgelegt.
3) eines Typs(Klasse) werden alle Merkmale festgelegt.
Vor der Verwendung muss jede Variable(Objekt), jede Funktion(Methode), jeder Typ(Klasse) definiert werden.
Deletions:
Deletions:
Additions:
{{files}}
Additions:
===Datenkapselung===
Attribute und Methoden der Klasse können als geschützt oder öffentlich deklariert werden. Normaleweise werden Attribute als private und Methoden als public d.h. öffentlich deklariert.
Ohne Datenkapselung können die Vorteile der Datenabstraktion durch das sogenannte Vorbeiprogrammieren an Methoden zerstört werden.
===Beispiel: Ein Element auf Stack legen===
**Prozedurale Lösung**
{{image url="oop3.gif" width="500"}}
Attribute und Methoden der Klasse können als geschützt oder öffentlich deklariert werden. Normaleweise werden Attribute als private und Methoden als public d.h. öffentlich deklariert.
Ohne Datenkapselung können die Vorteile der Datenabstraktion durch das sogenannte Vorbeiprogrammieren an Methoden zerstört werden.
===Beispiel: Ein Element auf Stack legen===
**Prozedurale Lösung**
{{image url="oop3.gif" width="500"}}