Come le funzioni, gli oggetti possono essere
trattati come entità incapsulate. Questo vuol dire in generale, che
è meglio evitare la modifica diretta o l'accesso ai dati membro.
Invece è consigliabile chiamare una funzione membro, permettendo
all'oggetto di mantenere i propri membri dati ed assicurarne
l'integrità. Fortunatamente, è possibile rafforzare le restrizioni
ai dati membro quando viene definita la classe impostandone i livelli
di accesso.
Presentare il programma Roditore privato
Il programma Roditore privato dimostra i
livelli di accesso ai membri della classe, introducendo nella classe
Roditore una restrizione ai livello di accesso che
costituiscono il suo livello di fame. La classe fornisce due funzioni
membro, una che permette l'accesso ai dati e l'altra che permette di
modificarli. Il programma crea un nuovo roditore e indirettamente
accede e modifica il livello di fame del roditore attraverso queste
funzioni. Comunque, quando il programma tenta di modificare il valore
di fame, usando un valore illegale, la funzione membro che ne
permette il cambiamento, lo comprende e ne vieta l'operazione.
Infine il programma utilizza un valore legale per impostare il
livello di fame. Il codice è il seguente:
// Roditore privato
//Dimostrazione dei livelli
di accesso
#include <iostream>
using namespace std;
class Roditore
{ public:
Roditore( int fame =0 );
int DaiFame() const;
void MettiFame( int fame);
void Saluto();
private: //sezione privata
int i_Fame;
};
Roditore::Roditore( int fame
): i_Fame (fame)
{ cout << “E' nato
un nuovo roditore!” << endl;
}
int Roditore::DaiFame()
const
{ return i_Fame;
}
void Roditore::MettiFame(
int fame)
{ if (fame < 0 ) cout <<
“Non ci puo' essere un valore negativo della fame.” <<
endl;
else i_Fame = fame;
}
void Roditore::Saluto()
//definizione funzione membro
{ cout << “Ciao, io
sono un roditore. Questo è il mio livello di fame ” <<
i_Fame << “.\n”;
}
int main()
{
Roditore topo(5);
// cout <<
topo.i_Fame; // illegale i_Fame è privato
cout << “Chiama
DaiFame():” << topo.DaiFame() << endl;
cout << “Chiamare
MettiFame() con -5” << topo.MettiFame( -5 );
topo.MettiFame(15);
topo.Saluto();
return
0;
}
Specificare i livelli di accesso Pubblico e Privato
Ogni classe di
funzioni e dati possiede un livello di accesso, il quale determina da
dove il programma ha accesso ad essi. Così, viene sempre specificato
quali hanno accesso pubblico usando la parola chiave public. In
Roditore, la sezione
pubblica viene introdotta con la linea:
public:
Roditore(
int fame =0 );
Utilizzando questa
parola chiave, sottolineo che ogni membro o funzione che segue sino
ad una diversa specifica di livello deve essere ritenuta pubblica.
Questo significa che ogni parte del programma ha accesso ad essi. Per
cui il codice del programma può richiamare queste funzioni della
classe Roditore.
Dopodiché viene
definita la sezione privata con la seguente linea di codice:
private: //sezione privata
int
i_Fame;
Usando private,
ogni membro dati o funzione che segue (sino a diversa specifica) deve
essere privata. Questo vuol dire che solo il codice nella classe
Roditore ha accesso
diretto ad esse. Poiché i_Fame
viene dichiarato in questa sezione, solo il codice presente in
Roditore può accedere
direttamente al membro dati i_Fame
dell'oggetto. Per cui tentare di accedere ad esso attraverso la
funzione main(), crea
un'operazione illegale la quale genera un errore nel programma.
//
cout << topo.i_Fame; // illegale i_Fame è privato
E' possibile
generare sezioni private in una classe seguite da sezioni pubbliche
ripetendo l'accesso ai modificatori. Infine ogni classe membro
dichiarata è privata per default, a meno di modifiche al livello di
accesso specifiche.
Nessun commento:
Posta un commento