La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a. 2001-2002 - 4° Ciclo Approfondimenti sulle Classi.

Presentazioni simili


Presentazione sul tema: "1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a. 2001-2002 - 4° Ciclo Approfondimenti sulle Classi."— Transcript della presentazione:

1 1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a. 2001-2002 - 4° Ciclo Approfondimenti sulle Classi

2 2 APPROFONDIMENTI SULLE CLASSI Oggetti costanti: Un oggetto può essere dichiarato con l’attributo const che impedisce di modificarlo: const Nome_Classe Nome_Oggetto (Parametri_Costruttore); Funzioni membro costanti: Poiché gli oggetti costanti non sono alterabili, non è consentito invocare le relative funzioni membro, a meno che queste non siano state dichiarate a loro volta costanti e quindi tali da accedere ai dati membro solo in lettura: Tipo_Restituito Nome_Funzione (……) const; //Prototipo …… Nome_Funzione (……..); //Invocazione //Implementazione Tipo_Restituito Nome_Classe::Nome_Funzione (……) const {……………………..}

3 3 APPROFONDIMENTI SULLE CLASSI Esempio di oggetto e funzione membro costanti class Time { public: Time (int=0, int=0, int=0); void setTime (int, int, int); void displayTime ( ) const; private: int ora, minuti, secondi;}; …………… int main ( ) { const Time reference (12, 0, 0); reference. displayTime ( ); ………….. }

4 4 APPROFONDIMENTI SULLE CLASSI Ancora sulle funzioni membro costanti Una stessa funzione può esistere in una versione non costante che si pone in overloading con quella costante: sarà il compilatore a decidere quale funzione chiamare a seconda se l’oggetto per la quale viene invocata è stato dichiarato costante o non costante. Le funzioni costruttore e distruttore di una classe non possono essere dichiarate costanti perché modificano gli oggetti.

5 5 APPROFONDIMENTI SULLE CLASSI Dati membro costanti: Anche i dati membro di una classe possono essere dichiarati costanti. Il costruttore della classe non può inizializzarli con un’assegnazione, ma, in tal caso, deve essere utilizzato il costrutto di inizializzazione. L’implementazione del costruttore assume quindi l’aspetto: Nome_Classe::Nome_Classe (Parametri_Costruttore e Inizializzazioni_Dati_Membro_Costanti) :Nome_Dato1_Membro_Costante (Inizializzazione_Dato1), Nome_Dato2_Membro_Costante (Inizializzazione_Dato2), ………… {……………………………………..}

6 6 APPROFONDIMENTI SULLE CLASSI Esempio di inizializzazione dati membro costanti: class Time { public: Time (int=0, int=0, int=0, int=0, int=0); void setTime (int, int, int); void displayTime ( ) const; private: const int oraBase, minutiBase; int ora, minuti, secondi;}; //Costruttore Time :: Time (int o, int m, int s, int oB, int mB) : oraBase (oB), minutiBase (mB) { setTime (o, m, s);} …………...

7 7 APPROFONDIMENTI SULLE CLASSI Uso del costrutto di inizializzazione La sintassi del costrutto di inizializzazione può ripetersi, con virgola di separazione, per tutti i dati membro della classe, anche non costanti. E’ comunque obbligatoria per i dati membro costanti e per i riferimenti. Inizializzazione degli oggetti membro Il costrutto di inizializzazione viene utilizzato anche per l’inizializzazione degli oggetti membro. In tal caso il costruttore assume l’aspetto: Nome_Classe::Nome_Classe (Parametri_Costruttore e Inizializzazioni_Oggetti_Membro) :Nome_Oggetto1_Membro (Inizializzazione_Oggetto1), Nome_Oggetto2_Membro (Inizializzazione_Oggetto2), ………… {……………………………………..}

8 8 APPROFONDIMENTI SULLE CLASSI Esempio di inizializzazione di un oggetto membro: class Time { public: Time (int=0, int=0, int=0, int=0, int=0, int=0, int=0); void setTime (int, int, int); void displayTime ( ) const; private: Clock clockRef;//Oggetto membro const int oraBase, minutiBase; int ora, minuti, secondi;}; //Costruttore Time :: Time (int o, int m, int s, int oB, int mB, int oR, int mR) : oraBase (oB), minutiBase (mB), clockRef (oR, mR) { setTime (o, m, s);}

9 9 APPROFONDIMENTI SULLE CLASSI Funzioni friend: All’interno della definizione di una classe si può dichiarare che un’altra funzione, presente al di fuori dello scope della classe, può anch’essa accedere ai membri privati della classe. Questa dichiarazione è: friend Prototipo_Funzione_Friend; Classi friend: All’interno della definizione di una classe si può dichiarare che un’altra classe può anch’essa accedere ai membri privati della prima classe. Questa dichiarazione è: friend class Nome_Classe_Friend;

10 10 APPROFONDIMENTI SULLE CLASSI Esempio di funzione friend di una classe: class Count { friend void setX (Count &, int);//Dichiarazione funzione friend public: Count ( ) { x= 0;} void print ( ); private: int x;}; …………………... void setX (Count &c, int val) {c. x= val;}//Implem. funzione friend int main ( ) { Count counter; setX (counter, 5);}//Invocaz. funzione friend

11 11 APPROFONDIMENTI SULLE CLASSI Uso di this: this è un puntatore che, utilizzato nell’implementazione di una funzione membro (purché non statica), permette l’accesso ai membri (privati o pubblici) dell’oggetto per il quale la funzione membro è invocata. Questo accesso avviene con i tradizionali costrutti: Con l’operatore freccia:this-> Nome_Membro Con il puntatore:(*this).Nome_Membro

12 12 APPROFONDIMENTI SULLE CLASSI Esempio dell’uso di this: class Alfa{//Definizione classe Alfa public: Alfa (int= 0): int funct (int); private: int x: };//Costruttore di Alfa Alfa::Alfa (int a) {x= a} //Funzione membro funct int Alfa::funct (int b) {return ((this->x) + b); } //Main int main( ) { int k; Alfa oggetto1 (5); k= oggetto1.funct(6); }

13 13 APPROFONDIMENTI SULLE CLASSI Invocazione di funzioni a cascata: Per invocazione di funzioni a cascata s’intende una sequenza di invocazioni del tipo:..Nome_Oggetto. FunzioneA(…). FunzioneB(…). FunzioneC (…)..; Questo è possibile se a valle dell’esecuzione dell’invocazione: Nome_Oggetto. FunzioneA(…) viene restituito un riferimento a Nome_Oggetto per cui quello che segue può essere interpretato come:..Nome_Oggetto. FunzioneB(…). FunzioneC (…)….; e così via in modo iterativo.

14 14 APPROFONDIMENTI SULLE CLASSI Realizzazione dell’invocazione a cascata: Per realizzare l’invocazione a cascata ogni funzione della sequenza (tranne l’ultima) deve essere realizzata come segue: Prototipo: Nome_Classe &Funzione (……...); Nota: il tipo da restituire è un riferimento a un oggetto della classe. Implementazione: Nome_Classe &Nome_Classe::Funzione (……..) {…………………………… return *this;} Nota: essendo this un puntatore ad un oggetto, l’operatore * serve a deferenziare il puntatore ottenendo l’oggetto.

15 15 APPROFONDIMENTI SULLE CLASSI Esempio di realizzazione di invocazione a cascata: class Count { public:Count ( ) {x= 0;}; Count &funzioneA (int); Count &funzioneB (int); void funzioneC (int); private:int x;}; Count & Count :: funzioneA (int k) {x= k; return *this;} Count & Count :: funzioneB (int j) {x= x + j; return *this;} Count :: funzioneC (int s) {x= x + s;} int main ( ) { Count accum; accum.funzioneA(3).funzioneB(4).funzioneC(6);}

16 16 APPROFONDIMENTI SULLE CLASSI Operatori new e delete: Gli operatori new e delete permettono di allocare e distruggere dinamicamente i dati (o oggetti) di qualsiasi tipo. La sintassi per l’allocazione è: Tipo_del_Dato *Nome_Puntatore; Nome_Puntatore= new Tipo_del_Dato; L’operatore new restituisce quindi un puntatore che risulta essere il solo mezzo per l’accesso al dato allocato. In modo più stringato si può scrivere: Tipo_del_Dato *Nome_Puntatore= new Tipo_del_Dato(Inizializzaz.); Dove con Inizializzaz. s’intende un valore di inizializzazione del dato allocato.

17 17 APPROFONDIMENTI SULLE CLASSI Operatori new e delete: Nel caso di allocazione di array la dichiarazione da fare è invece: Tipo_del_Dato *Nome_Puntatore= new Tipo_del_Dato[Dimensione]; La deallocazione di un dato (oggetto), in precedenza allocato con new, si ottiene con l’operatore delete nel seguente modo: delete Nome_del_Puntatore; Esempi: int *datoPtr; datoPtr= new int; float *varPtr= new float (3.14); int *arrayPtr= new int [10]; delete datoPtr; delete varPtr;

18 18 APPROFONDIMENTI SULLE CLASSI I dati membro static di una classe Per dichiarare che un dato membro esiste in una sola copia condivisa da tutti gli oggetti di una classe si deve utilizzare il modificatore static al momento della sua dichiarazione. Inizializzazione di un dato membro static Deve essere fatta nello scope di file (ad es. nel file delle implementazioni delle funzioni membro) con una assegnazione del tipo: Tipo_del_Dato Nome_Classe :: Nome_del_Dato= Inizializzazione;

19 19 APPROFONDIMENTI SULLE CLASSI Accesso ad un dato membro static: Un dato membro static esiste anche se non è stato instanziato alcun oggetto della classe. L’accesso ad un dato membro static ha quindi delle differenze nei casi precedenti o successivi alla dichiarazione di oggetti. Accesso dopo l’instanziazione di oggetti: Caso di dati static e pubblici: Tutti gli oggetti possono accedervi direttamente con le solite regole, oppure si può accedere con il costrutto: Nome_Classe :: Nome_Dato. Caso di dati static e privati: Solo tramite le funzioni pubbliche o friend della classe.

20 20 APPROFONDIMENTI SULLE CLASSI Accesso prima dell’instanziazione di oggetti: Caso di dati static e pubblici: Con il costrutto: Nome_Classe :: Nome_Dato. Caso di dati static e privati: Solo con funzioni membro static e pubbliche richiamate con il costrutto:...Nome_Classe :: Nome_Funzione...


Scaricare ppt "1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a. 2001-2002 - 4° Ciclo Approfondimenti sulle Classi."

Presentazioni simili


Annunci Google