Un'anteprima su classi e oggetti

Come ormai saprete, il linguaggio C++ è un'estensione del linguaggio C.
Sino ad ora, la maggior parte degli argomenti trattati sono comuni al C ed al C++, tranne alcune cose come ad esempio i namespace, le funzioni template e i membri mutable.
Sappiamo anche che il C è un linguaggio procedurale/strutturato, mentre il C++ introduce un nuovo paradigma di programmazione, orientata agli oggetti.
Tuttavia sino ad ora ci siamo limitati a programmare da un punto di vista procedurale, tramite l'uso delle funzioni e strutturato, tramite le strutture di controllo.

Procedure e strutture di controllo restano fondamentali anche nell'ambito della programmazione ad oggetti, dove continueremo ad utilizzare le funzioni, i controlli if - else if - else, i cicli for e while.

Quello che fa la programmazione ad oggetti è cambiare l'approccio alla programmazione.
Nella programmazione ad oggetti, ogni elemento di un programma è considerato un oggetto appartenente ad una classe.
Questo è un modo di vedere le cose molto più vicino al pensiero umano, tant'è vero che nel mondo in cui viviamo ogni cosa è un oggetto appartenente ad una classe.
La programmazione ad oggetti non fa altro che portare questo modello all'interno di un linguaggio di programmazione.

Per capire meglio come funziona la programmazione ad oggetti, è bene capire cosa si intende per classe e cosa si intende per oggetti, che sono i due elementi fondanti di questo paradigma.

Il modo migliore per capire le classi e gli oggetti è vedere in che modo sono legati gli uni agli altri. Facciamolo con un esempio:

la Panda, la Ferrari, la 500, sono tutti oggetti appartenenti alla classe automobile.

La classe è cioé un tipo astratto che descrive le caratteristiche comuni a tutte le automobili, mentre gli oggetti sono le istanze concrete di questa classe.

Così esisterà una classe cibo, e degli oggetti pollo, pizza, lasagne, pasta.

E' importante capire la differenza tra classe ed oggetti, e cioè capire che la classe è un qualcosa di astratto, non può essere utilizzata concretamente nella vita di tutti i giorni.

Non puoi mangiare la classe cibo, cibo è solo un'idea, un insieme di regole, di comportamenti, di caratteristiche comuni utilizzate nella creazione degli oggetti pollo, pizza ecc..

La classe cibo ci dice che tutti gli oggetti istanze di tale classe avranno delle caratteristiche comuni come la commestibilità, un sapore, un profumo invitante, il fatto che vanno cucinati e così via.

Lo stesso avviene nella programmazione ad oggetti, ed è molto simile a quanto abbiamo già visto nelle strutture. Ricordate quando ho detto che una volta capite le strutture si è a metà della strada che porta alla programmazione ad oggetti?

Ricordiamo che una struttura è un tipo astratto, creato da noi, con delle caratteristiche decise da noi, e per utilizzarlo dobbiamo creare delle istanze di tale struttura.

Ad esempio:

struct Cibo {
string sapore;
string profumo;
float digeribilità;
bool dolce;
};

Abbiamo appena creato la struttura Cibo, ma questa è solo un tipo astratto, non possiamo utilizzare la struttura Cibo come qualcosa di concreto. Non possiamo ad esempio fare:

Cibo.sapore = "leggermente piccante";

Perché il cibo in sé non è ne piccante ne agro, ne amaro ne salato.
La struttura serve solo a dire che tutte le istanze di Cibo avranno un sapore, un profumo, una certa digeribilità, e potranno essere dolci o salate; un po' come tutte le automobili hanno quattro ruote, un certo numero di sportelli e così via.

Non possiamo utilizzare la struttura Cibo in prima persona, dobbiamo utilizzare delle sue istanze concrete, come ad esempio il pollo o la pizza:

Cibo pizza;

pizza.profumo = "di basilico e pomodoro";

In questo esempio pizza è un'istanza concreta della struttura Cibo.

Lo stesso avviene per le classi, dove al posto della struttura si utilizza la classe, e le istanze concrete di tale classe sono chiamate oggetti.

Ma allora qual'è la differenza tra classi e strutture? Perché se esistono già le strutture dovremmo utilizzare le classi?

La differenza fondamentale tra le strutture e le classi, è che le strutture possono contenere solo dati, mentre le classi possono contenere anche funzioni.
In realtà questo è vero sono nel C, mentre nel C++ anche alle strutture è data la capacità di contenere funzioni, anche se esistono alcune differenze e di norma le struttura si utilizzano solamente nel modo tradizionale.

Quello che rende così speciale una classe è proprio questo, il fatto ciò di poter contenere sia dati che funzioni.
Questo fa sì che la classe sia autosufficiente.

Pensate ad esempio ad una struttura Automobile. Questa ci permette di descrivere le caratteristiche comuni a tutte le automobili, come ad esempio quattro ruote, il volante, i sedili ecc..
ma le automobili non hanno solo delle caratteristiche comuni, hanno anche dei comportamenti comuni, ad esempio tutte le macchine camminano, tutte le macchine frenano, tutte le macchine girano a destra e a sinistra, tutte le macchine trasformano il carburante in energia e così via.

Da un punto di vista della programmazione, una struttura ci permette di descrivere solo le caratteristiche statiche di un'automobile, mentre per descrivere dei comportamenti abbiamo bisogno delle funzioni.

Questa era solo un'anteprima sulle classi e sugli oggetti, nel prossimo post vedremo i vantaggi offerti dalla programmazione ad oggetti, dopodiché potremo finalmente vedere le classi e gli oggetti nel dettaglio.

1 commento:

Posta un commento