Achtergrond van de vraag:
Encapsulatie is een van de sleutelprincipe van OOP die in C++ is ontstaan vanaf het moment dat het werd geïntroduceerd. Het idee is om de toegang tot de interne staat van een object te beperken door alleen doordachte interfaces voor interactie te bieden. In C++ is encapsulatie geformaliseerd via de zichtbaarheid van de class-leden: public, protected, private.
Probleem:
Als encapsulatie niet wordt gebruikt, kan de interne staat van objecten vanuit elke plaats in het programma worden gewijzigd, wat leidt tot fouten, moeilijk te traceren bugs en een algemene afname van de betrouwbaarheid. Overmatige afsluiting kan het onderhoud en gebruik van klassen bemoeilijken.
Oplossing:
Het is belangrijk om het interface van de klasse (public section) en de implementatie (private/protected) duidelijk te scheiden. Voor toegang tot belangrijke gegevens moeten speciale methoden (getters/setters) worden gebruikt. Voor complexe logica moeten mechanismen via aanvullende klassen of sjablonen worden gescheiden. Gebruik const-methoden om de onveranderlijkheid van de toestand te waarborgen.
Codevoorbeeld:
class Counter { private: int value; public: Counter() : value(0) {} void increment() { ++value; } int get() const { return value; } };
Belangrijke kenmerken:
Is het mogelijk om rechtstreeks toegang te krijgen tot een private-lid van een ander object van dezelfde klasse binnen een methode?
Ja, binnen de methoden van de klasse kan men naar private-leden van andere objecten van dezelfde klasse verwijzen.
class Example { int val; public: void copyVal(const Example& other) { val = other.val; } // Geen fout! };
Kan een vriendfunctie toegang krijgen tot de private-leden van de klasse?
Ja, een friend-functie heeft volledige toegang tot private/protected-leden van de klasse.
Kan een constructor privé worden gemaakt? Waarom zou dat nodig zijn?
Ja, private constructors worden vaak gebruikt in singletons en fabrieksmethoden om de creatie van klasse-instanties te beheersen.
De klasse BankAccount bevat een public variabele balance. Elke externe code kan de balans rechtstreeks wijzigen, wat leidt tot fouten die bijna onmogelijk te onderzoeken zijn.
Voordelen:
Nadelen:
De variabele balance is verborgen, er zijn alleen beschermde methoden voor het wijzigen van de balans. Controles zijn binnen de klasse geïmplementeerd.
Voordelen:
Nadelen: