Calcolatori Elettronici III

Documenti analoghi
Dichiarazione di una classe. Dichiarazione ereditarietà

Il linguaggio C++ Ugo de Liguoro

A. Lorenzi, A. Rizzi Java. Programmazione ad oggetti e applicazioni Android Istituto Italiano Edizioni Atlas

Ereditarietà. Unità 9. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

Definizione di classi

Oggetti. La programmazione orientata agli oggetti, OOP (Object-Oriented Programming), prende il nome dall elemento su cui si basa, l oggetto.

IL TEMA DELLA RIUSABILITÀ

Lezione 8: Stringhe ed array multidimensionali

Strutture dati. Operatori di incremento e decremento. Strutture di dati. Strutture di dati. ++ e -- Esempi. Vettori e matrici.

Programmazione orientata agli oggetti Ereditarietà

Esempi al calcolatore su: 1) Costruttori ed ereditarietà 2) Subtyping e polimorfismo

Esempi al calcolatore su: 1) Costruttori ed ereditarietà 2) Subtyping e Polimorfismo

Reti di Connessione e Instradamento AA

Laboratorio di programmazione

Allocazione dinamica memoria

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.

OOP in C++ ha membro (dati membro) e funzioni membro In Java i dati membro sono chiamati attributi e le funzioni membro metodi

Programmazione con Java

Linguaggio C - Stringhe

Programmazione orientata agli oggetti Ereditarietà

Ingegneria del Software

Programmazione orientata agli oggetti Ereditarietà

Progettazione Object-Oriented

Introduzione al linguaggio C Puntatori

Esempio: Costruttori ed ereditarietà

Esercitazioni di Fondamenti di Informatica - Lez. 8 27/11/2018

Laboratorio di Algoritmi e Strutture Dati. Esercizi

Gestione dinamica della memoria

public class Counter2 extends Counter { public void dec() { val--; }

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

Sommario. Introduzione... xv. Giorno 1 Elementi base del linguaggio C

Esempi al calcolatore su: 1) Costruttori ed ereditarietà 2) Subtyping e Polimorfismo

Corso di Fondamenti di Informatica

C: panoramica. Violetta Lonati

Esempio 2: Subtyping

INFORMATICA OOP Relazioni tra classi Roberta Gerboni

costruttori e distruttori

Esercitazioni di Fondamenti di Informatica - Lez. 7 20/11/2018

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Un tipo di dato astratto (ADT) definisce una categoria concettuale con le sue proprietà: una definizione di tipo

Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente. per variabili di tipo array, in cui dover

Allocazione dinamica della memoria

Il paradigma OO e le Classi

Programmazione ad Oggetti

La programmazione ad oggetti (OOP)

Corso di Linguaggi di Programmazione

Informatica 3. Informatica 3. LEZIONE 8: Fondamenti di programmazione orientata agli oggetti (2) Lezione 8 - Modulo 1

Esempio di costruzione di una classe: un dizionario

Fondamenti di Informatica T-1

Allocazione dinamica della memoria

Programmazione orientata agli oggetti Oggetti Composti. Oggetti composti

Esercitazione 11. Liste semplici

Operazioni sulle stringhe Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

I Metodi. Fondamenti di Informatica A-K

Variabili dinamiche. Obiettivi: Presentare le variabili dinamiche, allocate e deallocate nell area HEAP, e le funzioni malloc e free

Gli oggetti. Ogni oggetto ha un interfaccia e ogni oggetto ha un tipo. Incapsulamento. Oggetti. Contatore. Invio di Messaggi

Operazioni sulle stringhe

Variabili e Funzioni. Informatica 1 / 19

La gestione della memoria dinamica Heap

Informatica 3. LEZIONE 8: Fondamenti di programmazione orientata agli oggetti (2)

Corso di Informatica A.A

Programmazione orientata agli oggetti Oggetti Composti. Oggetti composti

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

Concetti Base Encapsulation ed Ereditarietà Programmare con l Ereditarietà. Java: Ereditarietà. Damiano Macedonio

Stringhe in C. Nicu Sebe. Informatica Nicu Sebe 1 / 14

Ereditarietà e Polimorfismo. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi 132 Sesto San Giovanni

Le classi in java. Un semplice programma java, formato da una sola classe, assume la seguente struttura:

Programmazione orientata agli oggetti Ereditarietà

Ereditarietà: concetti di base

Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I)

Puntatori. Un puntatore contiene un numero che indica la locazione di memoria dove è presente la variabile puntata

Programmazione ad oggetti

Stringhe in C. Luca Abeni. Informatica Luca Abeni 1 / 10

Obiettivi. Comprendere i vantaggi offerti dal meccanismo dell ereditarietà Attivare processi di astrazione e specializzazione.

Strutture come parametri di funzioni

Classi ed Oggetti. Fondamenti di Informatica A-K

Uso avanzato dei puntatori Allocazione dinamica della memoria

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

Ereditarietà e Polimorfismo

Puntatori e array. Violetta Lonati

Informatica 1. Prova di recupero 21 Settembre 2001

La copia di un file. contare di quanti caratteri sia composto il file (e quindi determinare la dimensione del file di origine)

Corso sul linguaggio Java

Linguaggio C: Strutture e Liste Concatenate Valeria Cardellini

L'allocazione dinamica della memoria

Puntatori. Grazie ai puntatori:

Aritmetica dei puntatori

Componenti software. Obiettivi

Introduzione al C. Lezione 4 Allocazione dinamica della memoria. Rossano Venturini. Pagina web del corso

L'allocazione dinamica della memoria

Passaggio dei parametri

Programmazione a oggetti

Corso di Laboratorio 2 Programmazione C++ Silvia Arcelli. 24 Ottobre 2014

Transcript:

Slide 1 Politecnico di Torino sede di Alessandria Calcolatori Elettronici III ing. Dino Canonico dip. di Automatica e Informatica telefono: 011 564 7036 posta elettronica: dino@polito.it

Slide 2 Indice Parte I dai linguaggi procedurali al paradigma ad oggetti Introduzione Linguaggi procedurali Linguaggi ad oggetti Classi Ereditarietà Ridefinizione Classi virtuali Parte II: implementazione C++ Implementazione C++ Il costrutto class Regole di visibilità Implementazione dei metodi Costruttori e distruttori Overloading dei metodi Allocazione statica di oggetti Allcoazione dinamica di oggetti Ereditarietà in C++ Overloading degli operatori Slide 3 9 13 42 47 65 68 72 73 74 79 82 86 89 91 105 111

Slide 72 implementazione C++ il C++ implementa i meccanismi del paradigma ad oggetti con costrutti appositi le classi descrivono le potenzialità degli oggetti da essi instanziati vengono supportati i meccanismi di ereditarietà (semplice e multipla) data hiding overloading di operatori e funzioni vengono mantenuti inoltre i costrutti e le caratteristiche del linguaggio C

Slide 73 il costrutto class... il costrutto class definisce una classe è idealmente simile al costrutto struct del C, con due differenze sostanziali permette di raggruppare in una struttura non solo variabili ma anche funzioni permette di dividere le variabili e li funzioni in pubbliche (visibili ed utilizzabili da elementi esterni alla classe) e private (utilizzabili solo all interno della classe) viene scritto all interno di un file (generalmente.h), eventualmente insieme al resto del codice

Slide 74... il costrutto class... esempio sia data una classe che modelli un semplice contatore, capace di incrementare e decrementare il proprio valore fornire il proprio valore all esterno se ne scriva l implementazione C++

Slide 75... il costrutto class... dichiarazione del nome dichiarazione componenti private class counter int valore; public: void incrementa (); void decrementa (); int leggi (); dichiarazione componenti pubbliche

Slide 76... il costrutto class le definizioni delle componenti pubbliche e private seguono la sintassi del costrutto struct l insieme delle componenti pubbliche della classe corrisponde all interfaccia della classe stessa le componenti private sono invece funzioni e variabili di servizio, utilizzabili liberamente all interno della classe e quindi da metodi (funzioni) sia pubblici che privati, ma vengono nascosti agli utilizzatori terzi della classe questo procedimento si dice data hiding

Slide 77 regole di visibilità gli elementi (metodi e membri) di una classe possono essere dichiarati come public: visibili a chi fa uso della classe private: visibili solo alla classe stessa ma invisibili all esterno i membri possono anche esseer definiti protected: sono visibili alla classe stessa e alle classi che ereditano da essa le variabili comuni mantengono le regole di visibilià del C

Slide 78 funzioni friend è possibile definire funzioni che, pur essendo esterne ad una classe, ne possono manipolare i valori privati queste funzioni, pur essendo definite all interno dell interfaccia della classe non ne fanno parte queste funzioni devono essere definite tramite la keyword friend è possibile definire friend anche intere classi è una metodologia molto usata nel campo dell overloading degli operatori

Slide 79 implementazione dei metodi... dopo aver definito i metodi pubblici e privati occorre scriverne l implemetazione i membri vengono implementati separatamente rispetto alla definizione della classe e vi si collegano tramite la dichiarazione <nome_classe>:: anteposta al nome del metodo

Slide 80... implementazione dei metodi... si scriva l implementazione dei metodi della classe counter void counter::incrementa () valore ++; void counter::decrementa () valore ; int counter::leggi () return valore;

Slide 81... implementazione dei metodi i metodi vengono implementati all interno del listato tutti i metodi (pubblici e privati) possono "maneggiare" le variabili pubbliche e private all esterno però sono visibili solo i metodi pubblici e le variabili (o membri o attributi) pubbliche

Slide 82 costruttori e distruttori... la maniera nella quale vengono create le istanze di una classe non è automatica, ma va specificata in un apposito metodo (o in una apposita serie di metodi) detto costruttore allo stesso modo, alla fine dell elaborazione, le variabili oggetto allocate devono liberare le risorse impiegate nelle modalità espresse dal distruttore in una classe possono esistere più costruttori, tra i quali chi istanzia l oggetto (il programmatore) sceglie volta per volta quello che ritiene opportuno, ma un solo distruttore

Slide 83... costruttori e distruttori... il costruttore che non richiede alcun parametro in ingresso è detto costruttore di default il costruttore viene richiamato automaticamente se non si fa una allocazione esplicita discorso è analogo per quanto riguarda il distruttore i costruttori hanno lo stesso nome della classe, il distruttore ha lo stesso nome della classe preceduto dal simbolo tilde costruttori e distruttore non hanno un valore di ritorno

Slide 84... costruttori e distruttori class counter... public: counter (); counter (int); ~counter ();... counter::counter () printf ("costruttore\n"); valore = 0; counter::counter (int init) printf ("costruttore a %d\n", init); valore = init; counter::~counter () printf ("distruttore\n");

Slide 85 membri statici di una classe un membro statico di una classe è un membro in cui indirizzo è condiviso da tutte le istanze della classe in questione class counter static valore; public: void incrementa (); void decrementa (); int leggi (); int counter::valore = 0 counter c1 valore counter c1 counter c1

Slide 86 overloading dei metodi... è possibile che una classe abbia più metodi, identici per quanto riguarda nome e tipo del valore di ritorno, ma che accettino in ingresso parametri diversi questo comportamento (detto polimorfismo o overloading dei metodi) aggiunge flessibiltà agli oggetti scritti in C++

Slide 87... overloading dei metodi class counter... nome e valore di ritorno non cambiano public: void reset (); void reset (int);... cambiano invece i parametri in gioco

Slide 88 primo programma completo #include <stdio.h> class counter int valore; public: counter (); counter (int); ~counter (); void incrementa (); void decrementa (); int leggi (); void reset (); void reset (int); ; file counter.h counter::counter () printf ("chiamo il costruttore\n"); valore = 0; counter::counter (int val) printf ("chiamo il costruttore a valore %d\n", val); valore = val; counter::~counter () printf ("chiamo il distruttore\n"); Void counter::incrementa () valore ++; void counter::decrementa () valore ; int counter::leggi () return valore; void counter::reset () valore = 0; void counter::reset (int val) valore = val;

Slide 89 allocazione statica di oggetti... come le variabili allocate staticamente nel C gli oggetti possono essere allocati staticamente nel C++ i membri e i metodi pubblici sono accessibili con una sintassi simile a quella utilizzata per le strutture void main () counter c1, c2 (20);... c1.incrementa (); printf ("valore di c2: %d\n", c2.leggi ());

Slide 90... allocazione statica di oggetti #include <stdio.h> #include "counter.h" file myprogram.cpp void main () counter c1, c2 (10); c1.incrementa (); c1.incrementa (); printf ("c1 vale %d\n", c1.leggi ()); c2.reset (20); printf ("c2 vale %d\n", c2.leggi ()); shell di sistema dino ~/docs/poli/c3> gcc myprogram.cpp dino ~/docs/poli/c3>./a.out chiamo il costruttore chiamo il costruttore a valore 10 c1 vale 2 c2 vale 20 chiamo il distruttore chiamo il distruttore dino ~/docs/poli/c3>_

Slide 91 allocazione dinamica di oggetti... come anche le variabili del C, nel C++ è possibile allocare dinamincamente gli oggetti mediante l utilizzo di puntatori come nel C è necessario riservare esplicitamente la memoria da utilizzare; a differenza del C non si usa la funzione malloc (int) ma la keyword new, seguita dai parametri del costruttore per deallocare un oggetto non si usa la funzione free ma il costrutto delete, che invoca il distruttore specifico per la classe

Slide 92... allocazione dinamica di oggetti... anche in questo caso la sintassi è simile a quella usata per le strutture void main () counter *c1, *c2; c1 = new counter (); c2 = new counter (10);... c2 >incrementa (); printf ("valore di c1: %d\n", c1 >leggi ());... delete c1; delete c2;

Slide 93... allocazione dinamica di oggetti file myprogram.cpp #include <stdio.h> #include "counter.h" void main () counter *c1; counter *c2; c1 = new counter; c2 = new counter (10); c1 >incrementa (); c1 >incrementa (); printf ("c1 vale %d\n", c1 >leggi ()); c2 >reset (20); printf ("c2 vale %d\n", c2 >leggi ()); delete c1; delete c2; shell di sistema dino ~/docs/poli/c3> gcc myprogram.cpp dino ~/docs/poli/c3>./a.out chiamo il costruttore chiamo il costruttore a valore 10 c1 vale 2 c2 vale 20 chiamo il distruttore chiamo il distruttore dino ~/docs/poli/c3>_

Slide 94 creazione per copia normalmente gli oggetti vengono creati mediante l uso degli appositi costruttori esiste però un meccanismo collaterale detto "creazione per copia" che permette di creare un clone di un oggetto questo si ottiene utilizzando l oggetto da clonare come parametro del costruttore dell oggetto da creare void main () counter c1, c2 (10), c3 (c2);...

Slide 95 passaggio di parametri per valore e per riferimento... analogamente al C un oggetto può essere passato per valore o per riferimento: nel primo caso la funzione destinazione elabora una copia dell oggetto passato, nel secondo ne manipola effettivamente il contenuto valgono le stesse considerazioni fatte a suo tempo per il C (un puntatore passato per valore è come una variabile passata per riferimento...)

Slide 96... passaggio di parametri per valore e per riferimento void test::aumenta (counter c) c.incrementa (); void test::aumenta (counter* c) c >incrementa (); void main () counter c1, c2 (10); test t;... t.aumenta (c1); t.aumenta (&c2);

Slide 97 Esercizio... si implementi in C++ la classe Stringa, che permetta di inizializzare una stringa vuota, oppure di inizializzare una stringa a partire da un array di caratteri conoscere la lunghezza della stringa confrontare la stringa con un array di caratteri dato (uguale/diversa) trasformare i caratteri minuscoli in maiuscoli concatenare la stringa con un altra data

Slide 98... esercizio #include <string.h> #include <malloc.h> class Stringa char* valore; int dimensione; public: Stringa (); Stringa (char *); ~Stringa (); int lunghezza (); int ugualea (char *); void inmaiuscolo (); char* leggi (); void concatena (char*); ; Stringa::Stringa () valore = (char*) malloc (0); dimensione = 0; Stringa::Stringa (char *val) valore = (char*) malloc (sizeof (val) + 1); valore [strlen (val) 1] = \0 ; strcpy (valore, val); dimensione = strlen (valore); Stringa::~Stringa () free (valore); int Stringa::lunghezza () return dimensione; int Stringa::ugualeA (char* val) if (strcmp (val, valore) == 0) return 0; else return 1; void Stringa::inMaiuscolo () for (int a = 0; a < dimensione; a ++) if (valore [a] <= z && valore [a] >= a ) valore [a] = valore [a] a + A ; char* Stringa::leggi () return valore; void Stringa::concatena (char* altro) strcat (valore, altro); dimensione = strlen (valore);

Slide 99 esercizio si scriva il programma teststring che svolga le seguenti operazioni: allocazione statica e dinamica di due oggetti Stringa inizializzazione degli stessi dove necessario manipolazione distruzione dove necessario

Slide 100 Esercizio... si scrivano le classi ritenute necessarie per implementare un sistema di archivio produttori / prodotti / ordini si identifichino i produttori mediante nome e indirizzo si identifichino i prodotti mediante nome si identifichino gli ordini in base a produttore, prodotto ordinato e quntità di quest ultimo per semplicità si assuma che ogni ordine comprenda un solo prodotto

Slide 101... esercizio ordine prodotto produttore quantità produttore prodotto getnome () getindirizzo () getnome ()

Slide 102 Esercizio... si scrivano le classi necessarie per implementare un simulatore di pizzeria, comprendente clienti, tavoli, camerieri e forno si assuma per semplicità che non esistano tavoli separati ma un unica tavolata e che i clienti arrivino singolarmente si prevedano per ogni classe parametri che descrivano il comportamento della classe stessa con il passare del tempo

Slide 103...esercizio... class cliente int preferenza; int pazienza_minuti; int pasto_minuti; public: cliente (int, int); ~cliente (); class cameriere tavolo servizio; public: cameriere (tavolo); ~cameriere (); void interroga_cliente (cliente); void passa_ordine (forno); class tavolo int n_posti; int n_posti_liberi; public: tavolo (int); ~tavolo (); void occupa (); void rilascia (); int get_num_posti_liberi (); class forno int tempo_preparazione; int *coda; public: forno (); ~forno (); void accoda (int); void prepara (int);

Slide 104...esercizio classe cliente ogni cliente ha una preferenza sulla pizza da scegliere e questa è codificata con un numero intero. Inoltre ha un determinato "tempo di pasto" che è quello durante il quale occupa un posto di un tavolo classe tavolo un tavolo è caratterizzato dal numero totale di posti e dal numero di quelli liberi classe cameriere ogni cameriere è assegnato ad un tavolo (ipotesi semplicistica) il cameriere può interrogare un cliente sulle sue preferenze e passare l ordinazione così ad un forno classe forno un forno può accettare una serie di ordinazioni e accodarle in un array è caratterizzato inoltre da un tempo tipico di preparazione

Slide 105 ereditarietà in C++... secondo il paradigma ad oggetti, è possibile da una classe generale derivare una classe più particolare, aggiungendo nuovo metodi o ridefinendone alcuni della classe principale la classe derivata eredita dalla classe principale tutti i membri (anche quelli privati) tutti i metodi propri della classe tranne costruttori e distruttori overloading di operatori

Slide 106... ereditarietà in C++ per definire che una classe ne estende un altra occorre modificare il costrutto class in particolare occorre definire le regole che indichino quali parti originariamente private sono "raggiungibili" dalle classi derivate e quali no

Slide 107 esempio class scaffale int altezza, larghezza; int numero_ripiani; public: scaffale (); ~scaffale (); eredita da... void setaltezza (int); void setlarghezza (int); void setnumeroripiani (int); int getaltezza (void); int getlarghezza (void); int getnumeroripiani (void); non è il caso di ridefinire i metodi di scaffale class armadio : public scaffale int numero_ante; public: armadio (); ~armadio (); void setnumeroante (int); int getnumeroante (void);

Slide 108 Costruttori nelle classi derivate Se una classe B deriva da una classe A, può essere necessario dover invocare un costruttore specifico della classe A e non quello di default. In questo caso si specifica la chiamata al construttore richiesto direttamente nella definizione del costruttore della classe derivata La chiamata al costruttore della classe A va indicata immediatamente dopo la definizione del costruttore della classe B e va preceduta da un carattere ":"

Slide 109 Esempio... si scriva una classe veicolo che esporti i seguenti metodi: int leggi_num_ruote (void); int leggi_peso (void); si scriva una classe auto che aggiunga alla classe veicolo il metodo int leggi_num_posti (void);

Slide 110 file veicolo.h... esempio class veicolo int num_ruote; int peso; public: veicolo (int, int); ~veicolo (); int leggi_num_ruote (void); int leggi_peso (void); ; veicolo::veicolo (int r, int p) num_ruote = r; peso = p; veicolo::~veicolo (void) return; int veicolo::leggi_num_ruote (void) return num_ruote; #include "veicolo.h" file automobile.cpp class automobile : public veicolo int num_posti; public: uutomobile (int, int, int); ~automobile (); int leggi_num_posti (); ; automobile::automobile (int nruote, int peso, int nposti) :veicolo (nruote, peso) num_posti = nposti; int veicolo::leggi_peso (void) return peso; automobile::~automobile () int automobile::leggi_num_posti () return num_posti; richiesta di un costruttore specifico

Slide 111 Overloading degli operatori... è possibile definire il comportamento degli operatori standard del C per compiere operazioni specifiche su particolari oggetti il comportamento di un operatore si definisce come un metodo, con nome dato dall operatore stesso e preceduto dalla keyword operator generalmente è richiesta la dichiarazione friend dell operatore per poter maneggiare i dati interni

Slide 112... overloading degli operatori (esempio) class complex private: int real; int imag; public:... friend complex operator + (complex, complex);... ;... complex operator + (complex a, complex b) complex temp; temp.real = a.real + b.real; temp.imag = a.imag + b.imag; return temp;