Toegangscontrole is een fundamenteprincip van OOP dat ervoor zorgt dat de interne gegevens van een klasse worden geëncapsuleerd en beschermd.
Historie van de kwestie:
Klassiek C++ ondersteunt drie toegangsmodificatoren: public, protected, private. Het idee kwam voort om de interne implementatie van een klasse te beschermen en de interface van de implementatie te scheiden.
Probleem:
Zonder juiste toegangscontrole kunnen gebruikers van de klasse onbedoeld de interne toestand van objecten veranderen of de invarianties van de klasse schenden. Slecht ontworpen toegang maakt het moeilijker om de code te onderhouden en uit te breiden.
Oplossing:
Gebruik modificatoren om een duidelijke scheiding te maken tussen wat de externe wereld kan gebruiken en wat alleen voor interne doeleinden van het object is bedoeld.
Voorbeeldcode:
class Sample { private: int secret; protected: void setSecret(int s) { secret = s; } public: Sample(int s) : secret(s) {} int getSecret() const { return secret; } };
Belangrijke kenmerken:
protected (maar niet tot private).Kan een friend-functie of friend-klasse toegang krijgen tot de privéleden van een andere klasse?
Ja, het sleutelwoord friend biedt volledige toegang tot de privé- en beschermde leden van een klasse. Deze benadering moet zeer voorzichtig worden toegepast om de encapsulatie niet te schenden.
Voorbeeld:
class PrivData { private: int secret; friend void accessSecret(const PrivData& d); }; void accessSecret(const PrivData& d) { std::cout << d.secret; }
Kan toegang tot een private-lid worden verkregen door de naam te kennen, met behulp van pointers of typecasting?
Ja, door typecasting of geheugenmanipulatie (bijvoorbeeld de "pointer-to-member trick"), maar dit schendt de taalstandaarden en leidt tot onbepaald gedrag. Dit is niet toegestaan.
Wat gebeurt er bij overervng: worden private-leden van de bovenliggende klasse toegankelijk voor de afgeleide?
Nee, private-leden zijn niet rechtstreeks toegankelijk voor de afgeleide klasse; toegang is alleen mogelijk via public/protected accessor-methoden van de basis klasse.
Negatieve case
In een groot project waren alle leden van de klasse als public gedeclareerd om het prototypeproces te versnellen.
Voordelen:
Nadelen:
Positieve case
Alles is strikt verdeeld op toegangsniveaus, friend-functies worden alleen voor unit-tests gebruikt.
Voordelen:
Nadelen: