C++ Classi

Da Andreabont's Wiki.

Il C++ è un linguaggio che supporta il paradigma ad oggetti, i quali si sviluppano a partire dal concetto di classe. Una classe in C++ è una evoluzione della struct del C (e' infatti possibile usare struct al posto di class con minime differenze), le variabili interne sono equivalenti a quelle di una struct del C con l'aggiunta di una logica di gestione. In linea di massima una classe viene definita in un file header e i suoi metodi implementati in un file .cpp, ma questa non è una regola obbligatoria, ed è possibile definire una classe tutta in un unico punto dichiarandola implicitamente inline (Nei nostri esempi non ci sarà la divisione tra file header e file cpp)

Codice di esempio

Semplice

#include <iostream>
using namespace std;

class test {
public:
   void hello(string name) {
      cout << "Hello " << name << "!" << endl;
   }    
};

int main () {
   test a;
   a.hello("World");
}

Annidata

#include <iostream>
using namespace std;

class base {
    
private:
    
    class annidato {
        public:
        void hello_annidato(string name) {
            cout << "Hello " << name << "!" << endl;
        }   
    };
    
public:
   void hello_base(string name) {
      annidato a;
      a.hello_annidato(name);
   }    
};

int main () {
   base a;
   a.hello_base("World");
}

Modificatori di visibilità

Gli oggetti mantengono uno stato interno dato da una serie di variabili e metodi definiti nel loro contesto, nella definizione della classe è possibile definire i permessi di accesso a questo stato interno attraverso le etichette:

Modificatore Descrizione
public Chiunque può accedere alla variabile o al metodo.
protected Solo la classe e i suoi figli possono accedere alla variabile o al metodo.
private Solo la classe può accedere alla variabile o al metodo

E'altamente consigliato rendere visibile all'esterno solo lo stretto indispensabile, mantenento privato lo stato interno.

Da notare che in una class il modificatore di default è private, mentre in una struct è public.

Gestione dello stato interno

Lo stato interno di un'oggetto è idealmente di proprietà dell'oggetto stesso e ne è responsabile. Per accedere dalla classe al suo stato interno si utilizza la parola chiave this, che rappresenta il puntatore all'oggetto attuale. Per farlo esistono due metodi fondamentali per ogni oggetto: il costruttore ed il distruttore.

Costruttore

Il costruttore è un particolare metodo che viene chiamato alla creazione dell'oggetto, è normalmente utilizzato per inizializzare le variabili e allocare la memoria. Il costruttore ha sempre il nome della classe a cui appartiene. Se non viene specificato il compilatore ne utilizza uno standard.

class test {

private:
   int numero;

public:
   test(int n) {
      this->numero = n;
   }

};

Sfruttando una notazione apposita, è possibile inizializzare delle variabili private prima che sia eseguito il costruttore della nostra classe:

class test {

private:
   int numero;

public:
   test(int n) : numero(n) {
      // Altro codice
   }

};

Distruttore

Il distruttore è l'opposto del costruttore, in molti linguaggi non è presente, in quanto la gestione della memoria è delegata ad un garbage collector. In C++ la gestione della memoria è lasciata al programmatore, che può usare il distruttore per effettuare operazioni di chiusura delle risorse utilizzate dalla classe (per esempio deallocando la memoria). Il distruttore viene chiamato automaticamente quando l'oggetto sta per essere distrutto. Alla fine dell'esecuzione del distruttore l'oggetto cesserà di esistere. Il distruttore ha lo stesso nome della classe a cui appartiene, preceduto dal carattere "~". Se non specificato il compilatore utilizza un distruttore dei default, attenzione che questo distruttore non si preoccupa di deallocare la memoria istanziata esplicitamente sull'heap.

class test {

public:
   ~test() {
      // Operazioni di chiusura
   }

};