Nel capitolo precedente sono stati descritti, con l'ausilio di esempi tratti
dal quotidiano, alcuni aspetti fondamentali che sono alla base della
Programmazione Orientata ad Oggetti. In questo capitolo tali nozioni verranno
poste in relazione con il linguaggio C++, e da ciò emergerà tutta la
sua potenza espressiva e la efiicace capacità di modellazione del mondo reale.
Ricordiamo l'esempio del Telefono Cellulare fatto nel capitolo precedente. Si era evidenziato come esso è una astrazione concettuale che, nella realtà, si concretizza con la miriade di telefoni cellulari in commercio, ciascuno dei quali presenta particolari caratteristiche. In C++ tale astrazione prende il nome di Classe.
Una classe definisce un tipo di dato astratto, caratterizzato da una struttura
interna (generalmente non visibile, ovvero "privata") e da un insieme di
operazioni che possono essere eseguite su tale struttura (generalmente
visibili, ovvero "pubbliche").
Dal punto di vista sintattico, una classe si dichiara con la parola chiave
class, seguita dal nome della classe e può contenere:
class TelefonoCellulare { int Frequenza; //in MHz int Memoria; //in byte int Numero; char Acceso; //'0'=off; '1'=on public: TeleFonoCellulare(int,int,int); void TelefonoOn(); void TelefonoOff(); void Squilla(); void ComponiNumero(int); void Rispondi(); void CaricaBatteria(); };Nella definizione di una classe sono dapprima definiti i dati e le funzioni che risultano non accessibili dall'esterno, ovvero "privati": essi sono identificati dall'etichetta private (che è anche il valore di default, per cui si può omettere). Quindi, segue la sezione contenente i dati e le funzioni visibili o pubblici, identificati dall'etichetta public.
Una possibile definizione delle funzioni membro è la seguente:
TelefonoCellulare::TelefonoCellulare(int f, int m, int num) { Frequenza = f; Memoria = m; Numero = num; Acceso = '0'; } void TelefonoCellulare::TelefonoOn() { Acceso = '1'; } void TelefonoCellulare::TelefonoOff() { Acceso = '0'; } void Squilla() { cout << "Driiiiin...Driiiiin...Driiiiin\n"; } void TelefonoCellulare::ComponiNumero(int num) { if(Acceso) cout << "Sto componendo il numero:" << num; else cout << "Telefono spento!\n"; } void TelefonoCellulare::Rispondi() { if(Acceso) cout << "Pronto, chi parla?\n"; else cout << "Telefono spento!\n"; } void TelefonoCellulare::CaricaBatteria() { cout << "Sto caricando la batteria del cellulare!\n"; }Per indicare che queste funzioni sono funzioni membro della classe TelefonoCellulare, si usa l'operatore "::", detto Scope: esso informa il compilatore che tali funzioni appartengono alla classe indicata subito a sinistra dell'operatore di scope.
Nel corpo di alcune funzioni compare un nuovo modo di rappresentazione
dei dati di uscita rispetto al C. In C++, infatti, è definita una nuova
libreria per gestire l'I/O: iostream (per usare questa libreria,
si deve includere l'header iostream.h). Si approfondirà in seguito questa
libreria, ma per ora occorre accennare ai due operatori necessari ad effettuare
le più semplici operazioni di I/O:
#includecout << "Ciao mondo!"; L'espressione a destra dell'operatore è stampata sullo stream di output, attraverso cout. Essa è equivalente alla funzione C printf("Ciao mondo!");
int numero; cin >> numero; Il valore introdotto dallo stream di input (tastiera), attraverso cin, è assegnato alla variabile "numero" a destra dell'operatore. E' equivalente alla funzione C scanf("%d", &numero);
Un Oggetto è un'istanza di una classe.
Vediamo subito un esempio:
int main() { TelefonoCellulare MioTelefono(900,1024,03482334456); MioTelefonoOn(); MioTelefono.Squilla(); MioTelefono.Rispondi(); MioTelefonoOff(); }Con il codice precedente, è stato istanziato in memoria l'oggetto MioTelefono della classe TelefonoCellulare. Tale istanza provoca automaticamente la chiamata del costruttore della classe, con la relativa inizializzazione dei dati interni alla classe.
Driiiiin...Driiiiin...Driiiiin Pronto, chi parla?Per accedere alle funzioni membro pubbliche di una classe si usa la notazione a puntatore, mediante l'operatore ".".
In generale, una volta definito il progetto, non si scriverà il codice in
un unico file con estensione CPP (Modulo), poichè le capacità di
modifica ed i meccanismi di protezione sarebbero compromessi, ma si usano
più moduli.
In particolare, è buona norma destinare un file alla funzione
main() del programma (es. MAIN.CPP), un file header all'interfaccia
della classe (es. TELEFONO.H) ed un file alla sua realizzazione concreta
(es. TELEFONO.CPP).
Nel prossimo capitolo sarà esaminata nel dettaglio la funzione dei costruttori di una classe.
![]() Precedente |
![]() Home page |
![]() Successivo |