2. Classi ed Oggetti



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.

2.1 La nozione di Classe

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:

suddivise secondo i livelli di accesso permessi al programma (privati o pubblici). Pertanto, con riferimento all'esempio precedente, si può scrivere il seguente codice:
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.
Soltanto le funzioni membro hanno il privilegio di poter accedere ai dati privati di una classe. Tra di esse, una ha un significato speciale: è quella omonima alla classe di appartenenza, detta Costruttore della classe: essa viene invocata automaticamente al momento della dichiarazione di una variabile di quel tipo.
Si noti che il costruttore, di cui si parlerà in dettaglio nel prossimo capitolo, non restituisce alcun valore.

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.
Sintatticamente, si ha:
nome_classe :: nome_funzionemembro

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:


2.2 La nozione di Oggetto

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.
Si noti la corrispondenza tra i concetti di tipo e variabile, propri della programmazione strutturata, ed i nuovi concetti di classe ed oggetto, introdotti dalla OOP.
Il codice precedente determina la seguente stampa a video:
Driiiiin...Driiiiin...Driiiiin
Pronto, chi parla?
Per accedere alle funzioni membro pubbliche di una classe si usa la notazione a puntatore, mediante l'operatore ".".

2.3 Modularità

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.


dx
Precedente
back
Home page
dx
Successivo