Le contrôle d'accès est un principe fondamental de la POO, garantissant l'encapsulation et la protection des données internes de la classe.
Historique de la question :
Le C++ classique prend en charge trois modificateurs d'accès : public, protected, private. L'idée est venue pour protéger l'implémentation interne de la classe et séparer l'interface de l'implémentation.
Problème :
Sans un bon contrôle d'accès, les utilisateurs de la classe peuvent modifier de manière involontaire l'état interne des objets ou violer les invariants de la classe. Un accès mal conçu complique la maintenance et l'évolution du code.
Solution :
Utiliser des modificateurs pour faire une nette distinction entre ce que le monde extérieur peut utiliser et ce qui est réservé à des fins internes de l'objet.
Exemple de code :
class Sample { private: int secret; protected: void setSecret(int s) { secret = s; } public: Sample(int s) : secret(s) {} int getSecret() const { return secret; } };
Caractéristiques clés :
protected (mais pas à private).Une fonction friend ou une classe friend peut-elle accéder aux membres privés d'une autre classe ?
Oui, le mot clé friend donne un accès complet aux membres privés et protégés de la classe. Cette approche doit être appliquée avec précaution pour ne pas violer l'encapsulation.
Exemple :
class PrivData { private: int secret; friend void accessSecret(const PrivData& d); }; void accessSecret(const PrivData& d) { std::cout << d.secret; }
Peut-on accéder à un membre private en connaissant son nom, en utilisant des pointeurs ou un casting ?
Oui, par le biais de casting ou de manipulation de la mémoire (par exemple, "pointer-to-member trick"), mais cela viole les standards du langage et conduit à un comportement indéfini. Il ne faut pas le faire.
Que se passe-t-il lors de l'héritage : les membres privés de la classe parente deviennent-ils accessibles pour l'enfant ?
Non, les membres privés ne sont pas directement accessibles pour la classe dérivée, l'accès est possible uniquement par des méthodes d'accès public/protected de la classe de base.
Cas négatif
Dans un grand projet, tous les membres de la classe étaient déclarés publics pour un prototypage rapide.
Avantages :
Inconvénients :
Cas positif
Tout est strictement divisé par niveaux d'accès, les fonctions friend ne sont utilisées que pour des tests unitaires.
Avantages :
Inconvénients :