Il concetto che sta alla base della programmazione ad oggetti è quello della classe. Una classe C++ rappresenta un tipo di dati astratto che può contenere elementi in stretta relazione tra loro e che condividono gli stessi attributi.
Un oggetto, di conseguenza, è semplicemente un'istanza di una classe.
Vediamo un esempio per chiarire questo concetto:
Consideriamo la classe animale. Essa può essere vista come un contenitore generico di dati i quali identificano le caratteristiche (es: il nome, la specie, ecc.) e le azioni (es: mangiare, dormire, ecc.) comuni a tutti gli animali. In particolare le caratteristiche della classe vengono denominate proprietà o attributi, mentre le azioni sono dette metodi o funzioni membro. Una istanza della classe animale è rappresentata, ad esempio, dall'oggetto cane. Il cane è un animale con delle caratteristiche e delle azioni particolari che specificano in modo univoco le proprietà ed i metodi definiti nella classe animale.
Possiamo riassumere i concetti base della programmazione ad oggetti nel seguente modo:
- Possibilità di dichiarare una funzione come funzione membro di una determinata classe, che significa che tale funzione appartiene strettamente a quella classe e può agire solo sui membri di quella classe o su quelle da essa derivate.
- Possibilità di dichiarare i singoli attributi e funzioni membro della classe come:
private: accessibili solo alle funzioni membro appartenenti alla stessa classe
protected: accessibili alle funzioni membro appartenenti alla stessa classe e alle classi da questa derivate (vedremo tra poco cosa significa classe derivata).
public: accessibili da ogni parte del programma entro il campo di validità della classe in oggetto. - Possibilità di definire in una stessa classe, dati (attributi e/o funzioni membro) con lo stesso identificatore ma con diverso campo di accessibilità (public, protected, public). Tuttavia, si sconsiglia di usare questo approccio per non rendere difficilmente leggibile il programma.
- Possibilità di overloading delle funzioni (si veda la definizione data nei capitoli precedenti).
- Incapsulamento. Con tale termine si definisce la possibilità offerta dal C++ di collegare strettamente i dati contenuti in una classe con le funzioni che la manipolano. L'oggetto, è proprio l'entità logica che deriva dall'incapsulamento.
- Ereditarietà. E' la possibilità per un oggetto di acquisire le caratteristiche (attributi e funzioni membro) di un altro oggetto.
- Polimorfismo. Rappresenta la possibilità di utilizzare uno stesso identificatore per definire dati (attributi) o operazioni (funzioni membro) diverse allo stesso modo di come, per esempio, animali appartenenti ad una stessa classe possono assumere forme diverse in relazioni all'ambiente in cui vivono.