Geschichte der Frage:
Die Kapselung ist eines der grundlegenden Prinzipien der objektorientierten Programmierung, das seit dem Auftreten von C++ existiert. Die Idee ist es, den Zugriff auf den internen Zustand eines Objekts zu beschränken, indem nur durchdachte Schnittstellen für die Interaktion mit ihm bereitgestellt werden. In C++ ist die Kapselung durch die Sichtbarkeitsbereiche der Klassenmitglieder formalisiert: public, protected, private.
Problem:
Wenn die Kapselung nicht verwendet wird, kann der interne Zustand von Objekten von jedem Ort des Programms aus modifiziert werden, was zu Fehlern, schwer nachvollziehbaren Bugs und einem allgemeinen Rückgang der Zuverlässigkeit führt. Eine übermäßige Schließung kann jedoch die Wartung und Nutzung von Klassen erschweren.
Lösung:
Es sollte klar zwischen der Schnittstelle der Klasse (öffentlicher Abschnitt) und der Implementierung (privat/protegiert) unterschieden werden. Um auf wichtige Daten zuzugreifen, sollten spezielle Methoden (Getter/Setter) verwendet werden. Für komplexe Logik sollte der Mechanismus durch zusätzliche Klassen oder Vorlagen getrennt werden. Const-Methoden sollten verwendet werden, um die Unveränderlichkeit des Zustands sicherzustellen.
Codebeispiel:
class Counter { private: int value; public: Counter() : value(0) {} void increment() { ++value; } int get() const { return value; } };
Hauptmerkmale:
Kann man direkt innerhalb einer Methode auf ein privates Mitglied eines anderen Objekts derselben Klasse zugreifen?
Ja, innerhalb der Methoden der Klasse kann auf private Mitglieder anderer Objekte derselben Klasse zugegriffen werden.
class Example { int val; public: void copyVal(const Example& other) { val = other.val; } // Keine Fehler! };
Kann eine befreundete Funktion auf private Mitglieder der Klasse zugreifen?
Ja, die friend-Funktion hat vollen Zugriff auf private/protected Mitglieder der Klasse.
Kann ein Konstruktor privat gemacht werden? Warum ist das nötig?
Ja, private Konstruktoren werden häufig in Singletons und Fabrikmethoden verwendet, um die Erstellung von Instanzen der Klasse zu kontrollieren.
Die Klasse BankAccount enthält eine öffentliche Variable balance. Jedes externe Programm kann den Kontostand direkt ändern, was zu Fehlern führt, die nahezu unmöglich aufzuklären sind.
Vorteile:
Nachteile:
Die Variable balance ist verborgen, es gibt nur geschützte Methoden zur Änderung des Kontostands. Prüfungen sind innerhalb der Klasse implementiert.
Vorteile:
Nachteile: