L'incapsulamento è un principio del design orientato agli oggetti che implica la nascosta della struttura interna di un oggetto e la fornitura solo dell'interfaccia pubblica necessaria.
Storia della questione: Sin dall'inizio dell'OOP, uno degli obiettivi chiave è stato proteggere lo stato interno degli oggetti da modifiche errate dall'esterno e garantire un controllo rigoroso sulla logica.
Problema: Senza incapsulamento, tutti i dati e i metodi diventano accessibili al codice esterno, portando alla perdita di controllo sullo stato degli oggetti e all'emergere di errori difficili da rilevare.
Soluzione:
In C++ vengono utilizzati tre specificatori di accesso: private, protected, public. private impedisce l'accesso ai membri al di fuori della classe, protected consente l'accesso solo agli eredi, public rende i membri parte dell'interfaccia.
Esempio di codice:
class Stack { private: int *data; int top; public: Stack(); void push(int val); int pop(); };
Caratteristiche principali:
È vero che i membri privati non possono essere modificati in alcun modo al di fuori della classe?
Falso. Si possono utilizzare funzioni friend, classi friend o tecniche non sicure (come fare casting di puntatori o attraverso comportamenti indefiniti).
In quale ordine vengono applicati i specificatori durante l'ereditarietà (private, protected, public)?
Se l'ereditarietà è dichiarata come private, tutti i membri public e protected della classe base diventano membri private della classe derivata.
Qual è la differenza tra ereditarietà protected e private?
Con l'ereditarietà protected, tutti i membri public e protected della classe base diventano membri protected della derivata; con private, tutti diventano private.
Tutti i membri della classe sono dichiarati public, qualsiasi codice esterno può modificare la struttura e violare gli invarianti dell'oggetto.
Vantaggi:
Svantaggi:
Vengono utilizzati solo i metodi public necessari, mentre gli altri dati sono chiusi (private), lo stato è protetto.
Vantaggi:
Svantaggi: