Storia della questione:
L'incapsulamento è uno dei principi chiave della OOP, apparso in C++ sin dai suoi inizi. L'idea è limitare l'accesso allo stato interno di un oggetto, fornendo solo interfacce ben pensate per lavorare con esso. In C++, l'incapsulamento è formalizzato attraverso gli ambiti di visibilità dei membri della classe: public, protected, private.
Problema:
Se non si utilizza l'incapsulamento, lo stato interno degli oggetti può essere modificato da qualsiasi parte del programma, il che porta a errori, bug difficili da diagnosticare e una generale riduzione dell'affidabilità. Tuttavia, una chiusura eccessiva può rendere difficile la manutenzione e l'uso delle classi.
Soluzione:
È necessario distinguere chiaramente tra l'interfaccia della classe (sezione public) e l'implementazione (private/protected). Per accedere ai dati importanti, utilizzare metodi speciali (getter/setter). Per logiche complesse, separare il meccanismo attraverso classi o template aggiuntivi. Usare metodi const per garantire l'immutabilità dello stato.
Esempio di codice:
class Counter { private: int value; public: Counter() : value(0) {} void increment() { ++value; } int get() const { return value; } };
Caratteristiche chiave:
È possibile accedere a un membro privato di un altro oggetto della stessa classe direttamente all'interno del metodo?
Sì, all'interno dei metodi della classe è possibile accedere ai membri privati di altri oggetti della stessa classe.
class Example { int val; public: void copyVal(const Example& other) { val = other.val; } // Nessun errore! };
Una funzione amica può accedere ai membri privati della classe?
Sì, una funzione friend ha accesso completo ai membri private/protected della classe.
È possibile rendere un costruttore privato? A cosa serve?
Sì, i costruttori privati sono spesso utilizzati nei singleton e nei metodi factory per controllare la creazione di istanze della classe.
La classe BankAccount contiene una variabile public balance. Qualsiasi codice esterno può modificare il saldo direttamente, il che porta a errori la cui indagine è quasi impossibile.
Vantaggi:
Svantaggi:
La variabile balance è nascosta, ci sono solo metodi protetti per modificare il saldo. I controlli sono implementati all'interno della classe.
Vantaggi:
Svantaggi: