Corso di Fondamenti di Informatica II

Documenti analoghi
Corso di Programmazione a oggetti

Corso di Programmazione ad Oggetti

La programmazione a oggetti e il C++ (introduzione)

Laboratorio di programmazione

Ingegneria del Software

Programmazione orientata agli oggetti

Classi. Oggetti e classi. Creazione e inizializzazione di oggetti in C++ Distruzione di oggetti in C++

Linguaggi ad oggetti (object oriented) LINGUAGGI DI PROGRAMMAZIONE: PARADIGMI DI PROGRAMMAZIONE. Programmazione ad oggetti

Ereditarietà e Polimorfismo

ISTITUTO STATALE D ISTRUZIONE SUPERIORE FERRARIS - BRUNELLESCHI EMPOLI Anno scolastico 2015/2016

Definizione di metodi in Java

Programmazione Orientata agli Oggetti. Emilio Di Giacomo e Walter Didimo

L Allocazione Dinamica della Memoria

Introduzione alla Programmazione in Java attraverso un esempio commentato

La programmazione ad oggetti: chiamate di metodi. Overloading. This

Variabili. Unità 2. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

Programmazione Orientata agli Oggetti

Proprietà delle Classi e degli Oggetti in Java

Introduzione alla programmazione Object Oriented. Luca Lista

ADT: Abstract Data Type. Quasi ADT. ADT per collezioni di dati (code generalizzate) 04 I tipi di dati astratti (I parte)

Lezione 1 Introduzione alla programmazione ad oggetti

Abstact Data Type. Abstact Data Type. Pubblico e privato. Struttura di un ADT

Dispensa di Informatica III.1

Primi passi col linguaggio C

Linguaggi di alto livello, compilatori e interpreti

Sommario. Le differenze fra C e C++ Funzioni. Varie. Memoria. commenti. parametri per funzioni funzioni inline overloading di funzione

LINGUAGGI DI ALTO LIVELLO

Linguaggio C: le funzioni. Introduzione e sintassi

Oggetti e classi. Cos è un oggetto

Programmazione Orientata agli Oggetti in Linguaggio Java

Linguaggio C - sezione dichiarativa: costanti e variabili

Classi di memorizzazione

Corso di Fondamenti di Informatica. Puntatori e Allocazione Dinamica

Modelli di interazione tra processi

Informatica Generale Andrea Corradini I linguaggi di programmazione

Strutture dati e loro organizzazione. Gabriella Trucco

Fondamenti di Informatica T. Linguaggio C: i puntatori

UML I diagrammi implementativi

Informatica I. Ingegneria Medica. Prof. Diego Salamon

Fondamenti VBA. Che cos è VBA

Modelli di interazione tra processi

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

Corso di Fondamenti di Informatica

Tempo di vita e scope delle variabili

OO puro. Primi concetti di Java. Tipi primitivi. Ogni cosa è un oggetto. Java è object-oriented puro Non come il C+ + (OO ibrido) Lorenzo Bettini

IL CONCETTO DI CLASSE

Principi della programmazione orientata agli oggetti. I principi della programmazione ad oggetti

AXO - Architettura dei Calcolatori e Sistema Operativo. organizzazione strutturata dei calcolatori

Modelli di interazione tra processi

Lezione 6. Visibilità degli identificatori e tempo di vita degli oggetti

Lettura e scrittura di file di dati input/output

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

Corso di Programmazione ad Oggetti

Il C nel C++: Funzioni

Esempio Principio di sostituibilità

Oggetti Composti (1) Oggetti Composti (2)

Programmazione (imperativa)

Programmazione Java: Polimorfismo

Allocazione Dinamica della Memoria

DAGLI ALGORITMI AI LINGUAGGI. Linguaggi di Programmazione

Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1

Esiste però anche un ambiente globale: quello dove tutte le funzioni sono definite. Qui si possono anche definire variabili, dette variabili globali

Unità Didattica 3 Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

Lezione 21 e 22. Valentina Ciriani ( ) Laboratorio di programmazione. Laboratorio di programmazione. Lezione 21 e 22

Struttura dei programmi C

I vettori in C. Vettori. Definizione di vettori in C. int dato[10] ; int. Numero di elementi. Tipo di dato base. Nome del vettore.

Definizione di metodi

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Array multidimensionali e stringhe

Introduzione alla programmazione. Walter Didimo

Calcolatori Elettronici Lezione A4 Programmazione a Moduli

Prof. Pagani corrado JAVA

Sommario. Le strutture Le classi

Corso di Fondamenti di Informatica I

ESECUZIONE DI PROGRAMMI C SU MACCHINE REALI. Docente: Giorgio Giacinto AA 2009/2010

Serializzazione Java. Serializzazione. Calendario esercitazioni e laboratori. Applicazioni della Serializzazione

Files in C++ Fondamenti di Informatica. R. Basili. a.a

Gerarchia di classi Java 1

Finestre di dialogo. Corso di Laboratorio di Programmazione Web. Controllo dell input e window.alert. prompt di stringhe!

STRUTTURA DI UN PROGRAMMA

Argomenti Avanzati.! I puntatori! Stack! Visibilità delle Variabili

Sommario PREFAZIONE...XI CAPITOLO 1: INTRODUZIONE AI COMPUTER, A INTERNET E AL WEB... 1 CAPITOLO 2: INTRODUZIONE ALLA PROGRAMMAZIONE IN C...

Lezione 8. Visibilità degli identifcatori e tempo di vita degli oggetti

Programmazione di INFORMATICA e Laboratorio

Programmazione in Java. Indipendenza dalla piattaforma. Indipendenza dalla piattaforma. Autore: Roberto Fabbrica Diapo 1.

Allocazione dinamica della memoria

I livelli dei linguaggi. Introduzione alla OOP Object Oriented Programming. La programmazione procedurale separa il calcolo dalla memoria

Corso di Laurea Ingegneria Informatica Laboratorio di Informatica

Ingegneria del Software 4. Introduzione a UML. Dipartimento di Informatica Università di Pisa A.A. 2014/15

MPI. MPI e' il risultato di un notevole sforzo di numerosi individui e gruppi in un periodo di 2 anni, tra il 1992 ed il 1994

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

Sommario. Note alla traduzione... xix

Laboratorio di Informatica

Il linguaggio C. Notate che...

Introduzione al C. Tipi derivati

Fondamenti di Informatica T-1

Macchine astratte, linguaggi, interpretazione, compilazione

Corso di Ingegneria del Software. Modelli di produzione del software

ACSO Programmazione di Sistema e Concorrente

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

Transcript:

Corso di Fondamenti di Informatica II Introduzione alla programmazione orientata agli oggetti a.a. 2009/2010 Francesco Fontanella

Esercitazione 3 Rendere il progetto indipendente dalla struttura dati utilizzata per memorizzare l'elenco degli studenti. Creare il file studenti_lista.cpp. Nel file va ripetuta l'implementazione della esercitazione 1, ma usando una lista al posto vettore.

La Programmazione Modulare Nelle lezioni precedenti abbiano visto i vantaggi della programmazione modulare. Un programma può essere visto come un insieme di moduli che interagiscono tra di loro. Tutte le funzioni di un modulo sono scritte nello stesso file. Ogni modulo è fatto di due parti, la specifica e l'implementazione. Questi due aspetti sono separati mettendoli in due file diversi: la specifica si trova nel suo file.h mentre l'implementazione nel file.cpp. MODULO interfaccia (Visibile dall'esterno) corpo (Nascosto all'esterno e protetto) a.a. 2008/2009 3

La Programmazione Modulare I moduli non fanno parte del linguaggio, ma sono un'organizzazione del codice da parte del programmatore. La programmazione modulare offre enormi vantaggi nell'implementazione di programmi, in particolare al crescere della complessità dei programmi da scrivere. Tra i principali vantaggi: Suddivisione del lavoro tra diversi programmatori; Semplificazione del riuso del software Semplificazione della manutenzione; a.a. 2008/2009 4

La Programmazione ad Oggetti La programmazione ad oggetti rappresenta un ulteriore sviluppo rispetto alla programmazione modulare. La programmazione orientata agli oggetti ( Object Oriented Programming, OOP) è un paradigma di programmazione, in cui un programma viene visto come un insieme di oggetti che interagiscono tra di loro. Nei linguaggi OOP esiste un nuovo tipo di dato, la classe. Questo tipo di dato serve appunto a modellare un insieme di oggetti dello stesso tipo. In generale, un oggetto è caratterizzato da un insieme di attributi e da un insieme di funzionalità Un paradigma di programmazione è caratterizzato dall'insieme di concetti e astrazioni che utilizza per rappresentare un programma e i passi che compongono un calcolo. Esempi di paradigmi sono: imperativo, funzionale, object oriented, logico: a.a. 2008/2009 5

Un Esempio di Oggetto Un automobile può essere caratterizzata in questo modo: attributi funzionalità potenza frena marce accellera peso cambio marcia cilindrata caqmbia direzione È possibile interagire con l'automobile, per determinarne il suo comportamento attraverso il suo interfaccia che permette di effettuarele operazioni consentite: Pedale del freno Pedale dell acceleratore Leva del cambio volante a.a. 2008/2009 6

Un Ulteriore Esempio: un Videogioco a.a. 2008/2009 7

Classi e Oggetti: un Esempio Classi Orco Istanze (Oggetti) Cavaliere a.a. 2008/2009 8

La Programmazione Orientata agli Oggetti La programmazione orientata agli oggetti si basa su alcuni concetti fondamentali: Classe Incapsulamento Oggetto Ereditarietà Polimorfismo a.a. 2008/2009 9

Linguaggi ad Oggetti E possibile adottare tecniche di programmazione basate sugli oggetti anche in linguaggi tradizionali (ad es., in C o Pascal) adoperando opportune discipline di programmazione, aderendo cioè ad un insieme di regole. Queste regole non fanno però parte del linguaggio e il loro uso non può essere forzato né verificato dal compilatore. Un linguaggio di programmazione ad oggetti offre costrutti espliciti per la definizione di entità (oggetti) che incapsulano una struttura dati e le operazioni possibili su di essa. Alcuni linguaggi, in particolare il C++, consentono di definire tipi astratti, e quindi istanze (cioè, variabili) di un dato tipo astratto. In tal caso il linguaggio basato sugli oggetti presenta costrutti per la definizione di classi e di oggetti. a.a. 2008/2009 10

Classi e oggetti Nei linguaggi a oggetti, il costrutto class consente di definire nuovi tipi di dato e le relative operazioni. Le operazioni possono essere definite sotto forma di operatori o di funzioni (dette metodi o funzioni membro), i nuovi tipi di dato possono essere gestiti quasi allo stesso modo dei tipi predefiniti del linguaggio: si possono creare istanze, e si possono eseguire operazioni su di esse Un oggetto è una variabile che appartiene ad un particolare tipo di dato definito dall'utente per mezzo del costrutto class. Nel gergo dei linguaggi OO una variabile definita di un certo tipo (classe) rappresenta un'istanza della classe. Lo stato di un oggetto, invece, è rappresentato dai valori correnti delle variabili che costituiscono la struttura dati utilizzata per implementare il tipo di dato rappresentato definito dalla classe. a.a. 2008/2009 11

L istanziazione degli Oggetti Un oggetto è una istanza ( esemplare ) di una classe. Due esemplari della stessa classe sono distinguibili soltanto per il loro stato (i valori dei dati membro), mentre il comportamento (definto dalle funzioni membro) è sempre identico. variabili valori DV567AB a BV895GF Automobile b MK178NM c a.a. 2008/2009 12

La Classe: Definizioni Generali Una Classe è un tipo di dato definito dall'utente. E costituita da: Una struttura dati. Un insieme di operazioni consentite sulla struttura dati. Una Classe è rappresentata da due entità separate: Una specifica Un'implementazione a.a. 2008/2009 13

Caratteristiche di una Classe La classe è un modulo software con le seguenti caratteristiche: E dotata di un interfaccia (specifica) e di un corpo (implementazione); La struttura dati concreta di un oggetto della classe, e gli algoritmi che ne realizzano le operazioni, sono tenuti nascosti all interno del modulo che implementa la classe; Lo stato di un oggetto evolve unicamente in relazione alle operazioni ad esso applicate; Le operazioni sono utilizzabili con modalità che prescindono completamente dagli aspetti implementativi; in tal modo è possibile modificare gli algoritmi utilizzati senza modificare l interfaccia a.a. 2008/2009 14

Il Linguaggio C++ C++ è un linguaggio di programmazione general-purpose che supporta: la programmazione procedurale (è un C migliore ); la programmazione orientata agli oggetti; la programmazione generica. C++ è quindi un linguaggio ibrido, nel senso che supporta più paradigmi di programmazione. a.a. 2008/2009 15

L'Incapsulamento L'incapsulamento (in inglese: information hiding) è la suddivisione di un oggetto in due parti: Interfaccia: costituito dall'insieme di metodi (detti anche messagi) che possono essere invocati dall'utente per accedere alle funzionalità dell'oggetto; Implementazione Contiene l'implementazione delle funzionalità dell'oggetto e delle strutture dati necessarie È nascosta all utente L'incapsulamento è realizzato per mezzo delle istruzioni: Private: le funzioni e le variabili definite private NON sono accessibili all'esterno della classe. Public: le funzioni e le variabili definite publiche sono accessibili all'esterno della classe. a.a. 2008/2009 16

Le classi in C++ Il linguaggio C++ supporta esplicitamente la dichiarazione e la definizione di tipi astratti da parte dell'utente mediante il costrutto class; le istanze di una classe vengono dette oggetti. In una dichiarazione class occorre specificare sia la struttura dati che le operazioni consentite su di essa. Una classe possiede, in generale, una sezione pubblica ed una privata. La sezione pubblica contiene tipicamente le operazioni (dette anche metodi) consentite ad un utilizzatore della classe. Esse sono tutte e sole le operazioni che un utente può eseguire, in maniera esplicita od implicita, sugli oggetti. La sezione privata comprende le strutture dati e le operazioni che si vogliono rendere inaccessibili dall'esterno. a.a. 2008/2009 17

Le classi in C++: un Esempio Inter faccia c la s s Contatore { public : vo id Incrementa(); // operazione incremento vo id Decrementa(); // operazione decremento uns ig ned int give_value(); // restituisce il valore // corrente Implem entazione }; priva te: uns ig ned int value; // valore corrente c ons t uns ig ned int max; // valore massimo a.a. 2008/2009 18

Rappresentazione Grafica La notazione grafica è una metafora nella quale sono rappresentati in tre sezioni contigue: il nome della Classe la struttura dati (sequenza di variabili membro) i metodi della Classe (funzioni membro della classe). -Nome variabile 1: Tipo -Nome variabile 2: Tipo Nome della classe +funzione 1 (lista parametri formali): Tipo di ritorno +funzione 2 (lista parametri formali): Tipo di ritorno a.a. 2008/2009 19

Ruoli di una Classe Una Classe può giocare un duplice ruolo: Ruolo Client: cioè può utilizzare le risorse messe a disposizione da altre Classi. Ruolo Server: cioè essere usata da altre Classi o da un Programma Utente. Client Server << uso >> a.a. 2008/2009 20

Una Classe ha un'interfaccia Un altro esempio Nome della classe Light Interfaccia Operazioni +on() +off() +brighten() +dim() //Esempio di uso Light lt; lt.on(); a.a. 2008/2009 21

La Specifica di una Classe Rappresenta un'interfaccia per la classe stessa in cui sono descritte: le risorse messe a disposizione ai suoi potenziali utenti; le regole sintattiche per il loro utilizzo; E' separata dalla implementazione, permette utilizzo senza che l'utente conosca i dettagli di implementazione. È a cura dello sviluppatore della classe. E' scritta in un apposito "file di intestazione". a.a. 2008/2009 22

Specifica: Notazione Base //nome del file C.h c la s s C { public : //prototipi delle funzioni membro T1 f1(...); T2 f2(...);... priva te: //struttura dati int i; c ha r c;... }; //fine specifica della classe C NOTA di default tutti gli attributi sono private Pertanto possiamo scrivere: c la s s C { //struttura dati int i; char c;... public : T1 f1(...); T2 f2(...);... }; a.a. 2008/2009 23

L Implementazione di una Classe E' la codifica in C++ delle singole operazioni presentate nell'interfaccia della Classe. E' una particolare soluzione (può cambiare l'implementazione senza che cambi l'interfaccia) È a cura dello sviluppatore della classe. E' scritta in un apposito "file di implementazione " (con estensione.cpp) a.a. 2008/2009 24

Implementazione //nome del file C.cpp #include "C.h" T1 C::f1(...) { //realizzazione della funzione f1 } T2 C::f2(...) { //realizzazione della funzione f2... } //fine del file C.cpp deve includere anche l'header file a.a. 2008/2009 25

Uso di una Classe da Parte di un Modulo Utente. Affinché un programma possa utilizzare un classe deve: includere la specifica della classe (contenuta nel file nomeclasse.h) dichiarare istanze della classe. Utente.cpp include C.h include C.cpp a.a. 2008/2009 26

Uso di una Classe //PROGRAMMA UTENTE DELLA CLASSE C #include "C.h" deve includere anche l'header file main() { C c1; //definisce oggetto c1 della classe C C c2; //definisce oggetto c2 della classe C... c1.f1(...); //applica ad oggetto c1 la funzione membro f1 c1.f2(...); //applica ad oggetto c1 la funzione membro f2 c2.f1(...); //applica ad oggetto c2 la funzione membro f1... } //fine programma utente a.a. 2008/2009 27

Generazione del file eseguibile C.h include include C.cpp Utente.cpp Compilatore C++ C.o Utente.o linker Utente.exe a.a. 2008/2009 28

Ereditarietà e polimorfismo L ereditarietà consente di definire nuove classi per specializzazione o estensione di classi preesistenti, in modo incrementale Il polimorfismo consente di invocare operazioni su un oggetto, pur non essendo nota a tempo di compilazione la classe cui fa riferimento l oggetto stesso a.a. 2008/2009 29

Vantaggi della programmazione OO Rispetto alla programmazione tradizionale, la programmazione orientata agli oggetti (OOP) offre vantaggi in termini di: modularità: le classi sono i moduli del sistema software; coesione dei moduli: una classe è un componente software ben coeso in quanto rappresentazione di una unica entità; disaccoppiamento dei moduli: gli oggetti hanno un alto grado di disaccoppiamento in quanto i metodi operano sulla struttura dati interna ad un oggetto; il sistema complessivo viene costruito componendo operazioni sugli oggetti; information hiding: sia le strutture dati che gli algoritmi possono essere nascosti alla visibilità dall'esterno di un oggetto; riuso: l'ereditarietà consente di riusare la definizione di una classe nel definire nuove (sotto)classi; inoltre è possibile costruire librerie di classi raggruppate per tipologia di applicazioni; estensibilità: il polimorfismo agevola l'aggiunta di nuove funzionalità, minimizzando le modifiche necessarie al sistema esistente quando si vuole estenderlo. a.a. 2008/2009 30

I Costruttori È molto comune che una parte dell'oggetto debba essere inizializzata prima dell'uso. Per esempio nel caso della classe Contatore vista in precedenza è necessario inizilizzare il valore della variabile value. Poiché l'inizializzazione degli oggetti è un'operazione molto comune, il C++ consente di inizializzare gli oggetti al momento della loro creazione. Questa inizializzazione automatica è possibile utilizzando le funzioni costruttore. a.a. 2008/2009 31

I Costruttori Un costruttore è una particolare funzione membro di una classe che porta lo stesso nome della classe. Per le funzioni costruttore non deve essere specificato il tipo restituito, in quanto in C++ le funzioni costruttore non possono restituire valore. Esempio c la s s Contatore { public : Contatore();.. }; Contatore::Contatore() { value = 0; } a.a. 2008/2009 32

I Costruttori Il costruttore di un oggetto viene chiamato automaticamente nel momento in cui deve essere creato l'oggetto. Questo significa che la funzione costruttore di un oggetto viene chiamata al momento della dichiarazione dell'oggetto. Pertanto nella programmazione OO, la dichiarazione di una variabile di tipo oggetto, non è solo un'istruzione per così dire passiva di allocazione di memoria, ma implica l'esecuzione del codice contenuto nel costruttore della classe. Esempio #include Contatore.h Contatore cont1, cont2; Il costruttore viene eseguito per ognuna delle variabili dichiarate a.a. 2008/2009 33

I Costruttori I costruttori vengono chiamati anche per gli oggetti allocati dinamicamente. In questo caso, il costruttore viene chiamato al momento dell'allocazione. Esempio #include Contatore.h Contatore *cont_ptr; Il costruttore NON viene eseguito quando si dichiarano variabili di tipo puntaore cont_ptr = new Contatore; Il costruttore viene eseguito al momento dell allocazione dinamica a.a. 2008/2009 34

Costruttori parametrizzati I costruttori possono ricevere anche degli argomenti. Normalmente lo scopo degli argomenti è quello di passare un valore di inizializzazione. Esempio c la s s Contatore { public : Contatore(); Contatore(int val);.. }; Contatore::Contatore() { value = 0; } Contatore::Contatore(int val) { value = val; } a.a. 2008/2009 35

Costruttori parametrizzati È possibile definire costruttori con più parametri. Esempio C la s s Myclass { public : Myclass(int i, int j);.. priva te: int a; int b; }; Myclass::Myclass(int i, int j) { a = i; b = j; } a.a. 2008/2009 36

Costruttori Parametrizzati I costruttori parametrizzati possono essere utilizzati in fase di dichiarazione, o allocazione utilizzando la seguente sintassi: #include Contatore.h #include Myclass.h Contatore cont1, cont2(100), *cont_ptr; Myclass mc(0,0), *m_ptr; cont_ptr = new Contatore(10); m_ptr = new Myclass(1, 10); a.a. 2008/2009 37

Costruttori con un Solo Parametro Nel caso dei costruttori con un solo parametro è anche possibile la seguente sintassi: #include Contatore.h Contatore cont = 100; Viene chiamato il costruttore con parametro uguale a 100 a.a. 2008/2009 38

Struttura degli Oggetti Ciascun oggetto della classe è costituito: da una parte base, allocata per effetto della definizione dell oggetto nel programma utente in area dati statici, stack o heap, in base alla classe di memorizzazione; da una eventuale estensione, allocata in area heap Parte base int n char * s estensione a b c d e f g \0 a.a. 2008/2009 39

Distruttori Un distruttore è una funzione membro che: è necessaria solo se l oggetto presenta un estensione dinamica ha lo stesso nome della classe, preceduto da ~ (tilde) non restituisce risultato (neanche void) non ha alcun parametro Generalmente lo scopo dei distruttori è quello di deallocare l estensione dinamica di un oggetto NON può essere invocata esplicitamente dal programma utente, ma viene invocata implicitamente dal compilatore quando viene deallocato lo spazio di memoria assegnato all'oggetto. a.a. 2008/2009 40

Esempio di Distruttore Per quanto detto in precedenza, il costruttore serve per deallocare le estensioni dinamiche degli oggetti. Esempio stack.h C la s s Stack { public : Stack(); ~Stack();.. priva te: int *st_ptr; int num;.. }; stack.cpp // Costruttore Stack::Stack() { st_ptr = new int[size]; num = 0; } // Distruttore Stack::~Stack() { delete [] st_ptr; } Allocazione dinamica del vettore Dealloca il vettore dinamico a.a. 2008/2009 41

Esecuzione dei Distruttori I distruttori vengono eseguiti anche quando vengono deallocati oggetti precedentemente allocati dinamicamente. Esempio void funz() { Stack *st_ptr;. str = new Stack;.. delete st_ptr; Viene invocato il distruttore di stack } a.a. 2008/2009 42