Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 93 di 93
  • livello avanzato
Indice lezioni

La sintassi e le regole delle classi C++

Alcuni esempi di applicazione delle classi nel C++
Alcuni esempi di applicazione delle classi nel C++
Link copiato negli appunti

Per definire una classe in

[!] Ci sono problemi con l'autore. Controllare il mapping sull'Author Manager

utilizziamo la parola riservata class. Essa ci permette di definire l'interfaccia della classe, ovvero le proprietà e i metodi che gli oggetti metteranno a disposizione (esporranno) all'esterno.

Oltre a ciò nel blocco che segue class dichiariamo anche gli elementi protetti e privati dei nostri oggetti.

Subito dopo class indichiamo il nome della classe (ovvero il nome del tipo) e procediamo alla definizione della sua struttura.

Vediamo un esempio in cui definiamo una classe e indichiamo con i commenti una possibile organizzazione degli elementi:

class tipo
{
public:
/*
var1;
var2;
var3;
funzione membro 1
funzione membro 2
*/
protected:
/*
var4;
funzione membro 3;
*/
private:
/*
var5;
funzione membro 4;
funzione membro 5;
*/
};

Potremmo scrivere la definizione dell'interfaccia e l'implementazione dei metodi direttamente nello stesso file, ma è buona norma di inserire la definizione di una classe (l'interfaccia) in un file detto di header (intestazione, con estensione .h) e le implementazioni dei metodi della classe in file con estensione .cpp.

Vediamo un esempio di una semplice classe C++

// Semplice esempio di una classe C++
class Cliente
{
public:
char nome[20];
char cognome[20];
char indirizzo[30];
void inserisci_nome( );
void inserisci_cognome( );
void inserisci_indirizzo( );
};

In questa classe abbiamo definito sia gli attributi, sia le funzioni membro come public, ovvero accessibili dall'esterno e in ogni punto del programma.

Salviamo questa definizione di interfaccia in un file chiamato cliente.h e creiamo un nuovo file, che chiamiamo cliente.cpp, in cui scriviamo l'implementazione dei metodi.

Il file cliente.cpp potrebbe essere fatto così:

#include <iostream.h>
include "cliente.h"
void Cliente::inserisci_nome( )
{
cout << Inserire il nome del dipendente: ";
cin >> nome;
cout << endl;
}
void Cliente::inserisci_cognome( )
{
cout << Inserire il cognome del dipendente: ";
cin >> cognome;
cout << endl;
}
void Cliente::inserisci_indirizzo( )
{
cout << Inserire l' indirizzo del dipendente: ";
cin >> indirizzo;
cin >> get(newline); //elimina il Carriage Return
}
main()
{
Cliente cliente;
cliente.inserisci_nome( );
cliente.inserisci_cognome( );
cliente.inserisci_indirizzo( );
cout << "Il nome del cliente inserito è: " << cliente.nome << endl;
cout << "Il cognome del cliente inserito è: " << cliente.cognome << endl;
cout << "L' indirizzo del cliente inserito è: " << cliente.indirizzo << endl;
}

Avrete certamente notato la particolare sintassi utilizzata nel file Cliente.cpp relativamente alla implementazione delle funzioni membro. Essa segue la regola:

tipo_restituito nome_classe::nome_metodo( eventuali parametri)

dove l'operatore :: viene denominato operatore di scope.

Inoltre, come si può vedere facilmente dalla funzione main, ogni volta che si fa riferimento ad un attributo o ad una funzione membro di un oggetto, va utilizzata la sintassi:

oggetto.attributo;
oggetto.metodo();

Puntatori e operatore new

Supponiamo ora di creare lo stesso programma, ma cambiando il main nel seguente modo:

main()
{
Cliente* cliente;
cliente = new Cliente( );
cliente->inserisci_nome( );
cliente->inserisci_cognome( );
cliente->inserisci_indirizzo( );
cout << "Il nome del cliente inserito è: " << cliente->nome << endl;
cout << "Il cognome del cliente inserito è: " << cliente->cognome << endl;
cout << "L' indirizzo del cliente inserito è: " << cliente->indirizzo << endl;
delete cliente;
}

In questo caso nella funzione main definiamo un oggetto della classe Cliente servendoci però di un puntatore. In questo caso entrano in gioco due keyword fondamentali

  • new, che alloca la memoria necessaria all'instanziazione dell'oggetto e ne ritorna la relativa locazione di memoria.
  • delete, che servirà per liberare la memoria utilizzata per l'oggetto, una volta che non ci servirà più

Avendo a che fare con un puntatore all'oggetto, cambierà anche la modalità con la quale facciamo riferimento ai suoi metodi o ai suoi attributi (o proprietà). In questo caso infatti, invece del punto utilizziuamo l'operatore freccia (->):

oggetto->attributo;
oggetto->metodo();

I modificatori: private, public, protected

Se non specifichiamo nessun modificatore per un metodo o per un attributo all'interno di una classe, questi si intendono automaticamente private. Ad esempio:

class Cliente
{
char nome[20];
char cognome[20];
char indirizzo[30];
public:
void inserisci_nome( );
void inserisci_cognome( );
void inserisci_indirizzo( );
};

gli identificatori: nome, cognome e indirizzo, che si trovano subito dopo la dichiarazione del nome della classe, saranno attributi private e, come tali, utilizzabili soltanto all'interno della classe stessa.

Dobbiamo quindi fare attenzione e ricordare di inserire i modificatori di visibilità per metodi e attributi di una classe. Per non trovarci in una situazione simile a questa:

class Cliente
{
char nome[20];
char cognome[20];
char indirizzo[30];
void inserisci_nome( );
void inserisci_cognome( );
void inserisci_indirizzo( );
};

In questo caso infatti la classe Cliente sarebbe assolutamente inutilizzabile dall'esterno visto che tutti i suoi dati e metodi sono privati (non abbiamo specificato alcun modificatore di accesso). Per fortuna questo sarebbe chiaramente un errore e anche il compilatore ce lo farebbe notare.

Questo articolo contiene link di affiliazione: acquisti o ordini effettuati tramite tali link permetteranno al nostro sito di ricevere una commissione nel rispetto del codice etico. Le offerte potrebbero subire variazioni di prezzo dopo la pubblicazione.

Ti consigliamo anche