Le classi nel C++

Abbiamo già visto che, come le strutture, anche le classi servono per definire un nuovo tipo che verrà poi utilizzato per creare delle istanze concrete di tale tipo, dette oggetti.
Abbiamo anche accennato al fatto che una classe può contenere sia dati che procedure.

Nella programmazione ad oggetti i dati (ad esempio variabili o istanze di altri oggetti) vengono chiamati proprietà, mentre le procedure (o funzioni) vengono chiamate metodi.
Insieme, proprietà e metodi vengono detti membri della classe.

Vediamo quindi come dichiarare una classe.
La creazione di una classe si divide in due parti:

- la dichiarazione della classe che descrive le proprietà e i prototipi dei metodi;
- la definizione dei metodi, dove i metodi della classe vengono implementati;

Dichiarazione della classe:
class Classe {
private:
int proprieta1;
public:
int metodo1(int);
};
Definizione dei metodi della classe:
int Classe::metodo1(int param1)
{
proprieta1 = param1;
}
Nella prima parte forniamo l'interfaccia generale della classe, mentre nella seconda parte la implementiamo.

Naturalmente, così come avveniva nelle funzioni, è possibile dividere una classe in due files, dove la dichiarazione della classe va nell'header con estensione .h, mentre la definizione dei metodi va nel file con estensione .cpp .
L'unico accorgimento è quello di includere l'header all'interno del file cpp:
#include "classe.h"

int Classe::metodo1(int param1)

{
proprieta1 = param1;
}
Come vedete è molto semplice, basta ricordarsi di far precedere al nome del metodo il nome della classe seguito dall'operatore :: .

I metodi di una classe implementati all'interno della classe stessa vengono considerati automaticamente inline.

Avrete anche notato la presenza di due nuove parole: public e private.
In realtà ve n'è una terza chiamata protected.

Queste parole servono per controllare l'accesso ai membri della classe.
Nel nostro esempio la proprietà proprieta1 è dichiarata come private, mentre il metodo metodo1 è public.

Questo significa che il metodo metodo1 può essere richiamato dall'esterno, mentre la proprietà proprieta1 non è accessibile dall'esterno, e può essere modificata solo dai metodi interni della classe.

Ad esempio possiamo richiamare il metodo1 dalla nostra funzione main() o da un'altra classe, mentre non potremo accedere a proprieta1.

La parola protected è simile a quella private, tranne per il fatto che i membri dichiarati protected sono accessibili dalle classi figlie, ma lo vedremo meglio quando parleremo dell'ereditarietà.

Uno dei concetti chiave della programmazione ad oggetti è quello di nascondere i dati (data hiding).
Una classe renderà disponibile l'accesso dall'esterno solo alle proprietà necessarie per lavorare con la classe, mentre il resto sarà nascosto all'occhio dell'utilizzatore della classe, proprio come se questa fosse una scatola chiusa.

L'insieme dei metodi pubblici disponibili per lavorare con la classe è detto interfaccia della classe.

Per istanziare una classe, e cioè per creare un oggetto di tale classe, il metodo è identico a quello utilizzato per i tipi di base e per le strutture:

Classe oggetto1, oggetto2;

Mentre per accedere ai vari membri della classe si utilizza l'operatore punto . :

oggetto1.metodo();

oggetto1.proprieta = "valore";

Invece per accedervi tramite un puntatore si fa allo stesso modo delle strutture:

(*puntatore).metodo();

puntatore->metodo();

Nessun commento:

Posta un commento