07.10.2013 Aufrufe

Vorlesungsskript - Hochschule Emden/Leer

Vorlesungsskript - Hochschule Emden/Leer

Vorlesungsskript - Hochschule Emden/Leer

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

c○ Prof. Dr. B. Bartning, HS <strong>Emden</strong>/<strong>Leer</strong> Rumpfskript ” Informatik I/II“ (WS/SS 2010/11) 117<br />

(11.12) Freunde<br />

Globale Funktionen (11.13), Elementfunktionen oder auch alle Elemente einer Klasse können<br />

Freund einer Klasse sein, d. h. den Zugriff auf alle Bestandteile erhalten.<br />

Der Ort der 12 friend-Spezifizierung ist beliebig innerhalb der Klassendefinition wählbar, er<br />

ist unabhängig von Zugriffsspezifizierern:<br />

class TeilOffen {<br />

// Deklaration von Elementen<br />

// ...<br />

friend void ansicht();<br />

friend double AndereKlasse::zugriff(int a);<br />

friend class Neugierig;<br />

// ggf. Fortsetzung der Elementdeklarationen<br />

// ...<br />

};<br />

Semantik:<br />

Auf alle Elemente dieser Klasse TeilOffen – unabhängig von Zugriffsbeschränkungen –<br />

dürfen zugreifen:<br />

die (globale, d. h. nicht einer Klasse angehörige) Funktion ansicht,<br />

die Elementfunktion zugriff der Klasse AndereKlasse,<br />

alle Elemente der Klasse Neugierig.<br />

Anm1 Das Auftreten von friend deutet wegen des Aufbrechens des Geheimnisprinzips meist einen<br />

Entwurfsfehler an. Es gibt nur wenige Fälle, in denen ein friend sinnvoll und gerechtfertigt<br />

ist, s. z. B. (Kap. 11.2). Es ist wichtig, dass man sehr sparsam mit dieser Möglichkeit umgeht<br />

und zunächst immer überlegt, ob man nicht auch ohne friend auskommen kann.<br />

Anm2 Die Spezifizierung friend ist nicht symmetrisch. Zum obigen Beispiel:<br />

Damit die Klasse TeilOffen auch auf verborgene Elemente der Klasse Neugierig zugreifen<br />

kann, muss sie in Neugierig als Freund eingetragen sein.<br />

Anm3 Die Spezifizierung friend ist auch nicht transitiv. Zum obigen Beispiel:<br />

Ist die Klasse Weiter ein Freund von Neugierig (d. h. in Neugierig als Freund eingetragen),<br />

so ist nicht automatisch Weiter ein Freund von TeilOffen.<br />

Anm4 Die Spezifizierung friend wird auch nicht vererbt.<br />

Anm5 Zum obigen Beispiel: Die Klasse AndereKlasse mit der Elementfunktion zugriff muss dem<br />

Compiler an der Stelle der friend-Deklaration bekannt sein.<br />

Anm6 Zum obigen Beispiel: Falls Neugierig als Klassenname bekannt ist, kann man das Schlüsselwort<br />

class weglassen, es genügt folgende Angabe:<br />

friend Neugierig;<br />

Anm7 Zum Umgang des Compilers MS Visual C ++ 6.0 mit friend-Operatorfunktionen s. (11.23d).<br />

(11.13) Zeiger this<br />

(a) Eine Elementfunktion erhält bei jedem Aufruf als impliziten zusätzlichen ersten Parameter<br />

einen Zeiger auf das Objekt, zu dem sie aufgerufen wird. Dieser Zeiger hat den Namen this.<br />

Ist das Objekt, deren Elementfunktion aufgerufen wird, vom Typ T, so ist this vom Typ<br />

T *const,<br />

d. h. der Zeiger this zeigt auf T und ist konstant, vgl. (10.28, 10.25). Eine Änderungserlaubnis<br />

von this ergäbe auch keinen Sinn.<br />

(b) Wegen (a) muss genau zwischen Elementfunktionen und globalen Funktionen unterschieden<br />

werden: erstere können nur in Zusammenhang mit einem Objekt aufgerufen werden<br />

(auf das der implizite Zeiger this zeigt), die zweiten ohne Objekt.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!