edit: Die FAQ etwas länger lesen Ich mag die Idee, dass der Operator << >> als Freund dieser Klassen überladen und hinzugefügt wird, bin mir jedoch nicht sicher, wie dies die Kapselung nicht unterbricht
Wie würde es die Kapselung brechen?
Sie unterbrechen die Kapselung, wenn Sie uneingeschränkten Zugriff auf ein Datenelement zulassen . Betrachten Sie die folgenden Klassen:
class c1 {
public:
int x;
};
class c2 {
public:
int foo();
private:
int x;
};
class c3 {
friend int foo();
private:
int x;
};
c1
ist offensichtlich nicht eingekapselt. Jeder kann es lesen und ändern x
. Wir haben keine Möglichkeit, irgendeine Art von Zugangskontrolle durchzusetzen.
c2
ist offensichtlich eingekapselt. Es gibt keinen öffentlichen Zugang zu x
. Sie können lediglich die foo
Funktion aufrufen , die eine sinnvolle Operation für die Klasse ausführt .
c3
? Ist das weniger gekapselt? Ermöglicht es uneingeschränkten Zugriff auf x
? Ermöglicht es den Zugriff auf unbekannte Funktionen?
Nein. Es ermöglicht genau einer Funktion, auf die privaten Mitglieder der Klasse zuzugreifen. Genau wie c2
. Und genau wie c2
die einzige Funktion, die Zugriff hat, ist nicht "eine zufällige, unbekannte Funktion", sondern "die in der Klassendefinition aufgeführte Funktion". Genauso c2
können wir anhand der Klassendefinitionen eine vollständige Liste der Personen sehen, die Zugriff haben.
Wie genau ist das weniger gekapselt? Die gleiche Menge an Code hat Zugriff auf die privaten Mitglieder der Klasse. Und jeder , der Zugriff hat, ist in der Klassendefinition aufgeführt.
friend
bricht die Kapselung nicht. Einige Java-Programmierer fühlen sich unwohl, denn wenn sie "OOP" sagen, meinen sie tatsächlich "Java". Wenn sie „Encapsulation“ sagen, meinen sie nicht, sondern „eine Java - Klasse , wo die einzigen Funktionen der Lage , den Zugang private Mitglieder, sind die Teilnehmer“ „private Mitglieder müssen vor willkürlichen Zugriffen geschützt werden“, auch wenn dies völliger Unsinn ist für mehrere Gründe .
Erstens ist es, wie bereits gezeigt, zu einschränkend. Es gibt keinen Grund, warum Freundmethoden nicht dasselbe tun dürfen.
Zweitens ist es nicht restriktiv genug . Betrachten Sie eine vierte Klasse:
class c4 {
public:
int getx();
void setx(int x);
private:
int x;
};
Dies ist gemäß der oben genannten Java-Mentalität perfekt gekapselt.
Und doch erlaubt es absolut jedem, x zu lesen und zu modifizieren . Wie macht das überhaupt Sinn? (Hinweis: Nicht)
Fazit: Bei der Kapselung geht es darum, steuern zu können, welche Funktionen auf private Mitglieder zugreifen können. Es geht nicht genau darum, wo sich die Definitionen dieser Funktionen befinden.