Il paradigma OO e le Classi

Documenti analoghi
La programmazione ad oggetti (OOP)

4. Accesso diretto per gli archivi con record a lunghezza costante

La classe std::vector della Standard Template Library del C++

Corso di Programmazione ad Oggetti

Laboratorio di programmazione

Fondamenti di Informatica - 1. Prof. B.Buttarazzi A.A. 2011/2012

Linguaggio C++ Linguaggi di terza generazione

Università degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Stringhe. Anno Accademico 2010/2011 Francesco Tortorella

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

Dati aggregati. Violetta Lonati

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

Programmazione orientata agli oggetti. Ivan Lanese

Programmazione ad oggetti

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

La scrittura di un programma Modellizzazione del programma Scrittura del codice Esercizi. Sperimentazioni I. Alberto Garfagnini, Marco Mazzocco

Programmazione Orientata agli Oggetti

La scrittura di un programma Modellizzazione del programma Scrittura del codice Esercizi. Sperimentazioni I. Alberto Garfagnini, Marco Mazzocco

Programmazione Procedurale in Linguaggio C++

Breve Manuale di Riferimento sulla Sintassi Linguaggi C++ e FORTRAN

Esercizio 2: Algebra dei Puntatori e Puntatori a Puntatori

1: /* Nome del programma: gestione_articoli_01.cpp 2: Realizzato da: Gaetano Della Cerra 3: Data: 06/02/ III Informatica Serale I.T.I.S.

Laboratorio di Algoritmi e Strutture Dati

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

Implementazione dell albero binario in linguaggio C++

Laboratorio di Informatica

Programmazione Java Struttura di una classe, Costruttore, Riferimento this

Laboratorio di Informatica

Laboratorio di Programmazione e Calcolo

Introduzione al C++ Corso di C++ INFN LNS 13 Dicembre Corrado Santoro

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

Il linguaggio C. Puntatori e dintorni

Ereditarietà e Polimorfismo

Programmazione a oggetti

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Corso di Fondamenti di Informatica

Gestione di stringhe. Le stringhe in C/C++

Classe Vettore (i) Creare una classe che consenta di gestire un vettore di N elementi reali (double), che preveda i seguenti metodi:

Ricerca e ordinamento su array di oggetti. Corso di Programmazione 2 Esercitazione 5

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

Definizione di classi. Walter Didimo

Fondamenti di Informatica T-1. Classi & vettori

Primi passi col linguaggio C

Const, friend, static,this

14 - Metodi e Costruttori

Programmazione modulare

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

Riassunto: cos è la OOP? classi astratte, interfacce, classi interne. Scaletta. Figura con area()? Figura senza area()? Stefano Mizzaro 1.

#include <iostream> // libreria che gestisce flusso di input e output. using namespace std; // uso di librerie standard del C++

ESERCIZI DI PROGRAMMAZIONE C/C++ per le classi seconde

18 - Classi parzialmente definite: Classi Astratte e Interfacce

16 - Ereditarietà, tipi e gerarchie

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

Transcript:

Oggetti e Classi (CAP 10) Alberto Garfagnini Università degli studi di Padova 1 Dicembre 2009 Il paradigma OO e le Classi La programmazione ad Oggetti () è una filosofia di programmazione che si basa sui seguenti concetti: 1. astrazione 2. encapsulation e data hiding 3. polimorfismo 4. inheritance 5. riutilizzo del codice la classe incarna in pieno la filosofia OO: permette di tradurre una astrazione in un tipo definito dall utente; incorpora la rappresentazione dei dati e dei metodi per la loro manipolazione (interfaccia con l utilizzatore).

Progettazione di una classe in C++ Supponiamo di disegnare una classe che permette di gestire gli studenti iscritti al corso di Laurea in Fisica. Le operazioni (semplificate) che uno studente può fare sono: iscriversi al primo anno di un corso di laurea; rinnovare la propria iscrizione ad un anno successivo (se il numero di CFU sostenuti lo permettono); PUBLIC INTERFACE sostenere e registrare degli esami; mostrare la propria matricola (ove richiesta); visualizzare il numero di CFU acquisiti. Le informazioni che devono essere memorizzate sono: il numero di matricola; i dati anagrafici (nome e cognome); il numero di CFU sostenuti; l anno di corso al quale è iscritto. INTERNAL DATA Creazione di una Classe Per scrivere una classe è necessario fornire: 1. una dichiarazione della classe che descrive le componenti dei dati in termini dei data members, e realizza l interfaccia pubblica in termini di function members (chiamati anche semplicemente metodi). 2. le definizioni dei metodi della classe che forniscono l implementazione delle funzioni, metodi della classe. Data Hiding Public Interface class classname private: data member declarations public: member function prototypes ;

Class Declaration: Studente // Dichiarazione Classe Studente #include <cstring> class Studente private: int matricola; char nome[30]; char cognome[50]; int anno_corso; int cfu_acquisiti; public: void iscrivi_i_anno(int matricola, const char * cognome, const char * nome); void registra_esame( int cfu ); int get_matricola( ); int get_cfu( ); void stampa_sommario( ); ; Class Members Implementation: Studente (parte 1) // Member Functions per la Classe Studente void Studente::iscrivi_I_anno( int c, const char * cg, const char * nm) std::strncpy( nome, nm, 30 ); nome[29] = \0 ; std::strncpy( cognome, cg, 50 ); cognome[49] = \0 ; matricola = codice; cfu_acquisiti = 0; void Studente::stampa_sommario( ) using namespace std; cout << "cognome: " << cognome; cout << " nome: " << nome << endl; cout << " matricola: " << matricola << endl; cout << " anno di corso: " << anno_corso << endl; cout << " CFU superati: " << cfu_acquisiti << endl;

Class Members Implementation: Studente (parte 2) // Registra un nuovo esame int Studente::registra_esame( int cfu ) if ( cfu < 0 ) return; cfu_acquisiti += cfu; // Ritorna il numero di matricola dello Studente int Studente::get_matricola( ) return matricola; // Ritorna il CFU acquisiti int Studente::get_cfu( ) return cfu_acquisiti; // Esempio di utilizzo della classe Studente Studente iscritto cognome: Rossi nome: Aldo int main( ) matricola: 5432 anno di corso: I using namespace std; CFU superati: 0 Dopo il primo esame - CFU: 12 Studente aldo; aldo.iscrivi_i_anno(5432, "Rossi", "Aldo" ); cout << "Studente iscritto" << endl; aldo.stampa_sommario( ); // Registra Sperimentazioni I aldo.registra_esame( 12 ); cout << "Dopo il primo esame -"; << "CFU: " << aldo.get_cfu( ) << endl; return 0;

I metodi Costruttori Una volta definita la classe è possibile dichiarare degli oggetti Studente aldo; Ma non è possibile inizializzare direttamente i suoi dati, come si farebbe per altri tipi: int year = 2009; // codice valido struct point double x, y; ; point origin = 0, 0; // valido Studente s = 598765, "Rossi", "Mario"; // Errato! Per inizializzare i dati di una classe è necessario invocare un metodo speciale chiamato costruttore. Perchè soltanto all interno di un metodo è possibile accedere alla parte privata della classe. Definiamo un costruttore per la classe Studente // Costruttore per la Classe Studente Studente::Studente( int c, const char * cg, const char * nm) std::strncpy( nome, nm, 30 ); nome[29] = \0 ; std::strncpy( cognome, cg, 50 ); cognome[49] = \0 ; matricola = codice; cfu_acquisiti = 0; // Default Constructor Studente::Studente( ) nome[0] = \0 ; cognome[0] = \0 ; matricola = 0; cfu_acquisiti = 0; Il compilatore crea un Default Constructor vuoto se non è fornito dal programmatore Studente::Studente( )

La Classe Studente rivista // Dichiarazione Classe Studente #include <cstring> class Studente private: int matricola; char nome[30]; char cognome[50]; int anno_corso; int cfu_acquisiti; public: Studente( ); Studente(int matr, const char * cognome, const char * nome); void registra_esame( int cfu ); int get_matricola( ); int get_cfu( ); void stampa_sommario( ); ; Utilizzo dei costruttori della classe Studente In che modo è possibile creare e inizializzare un oggetto: Studente a(23,"rossi","aldo"); Studente a = Studente(544,"Verdi","Carla"); È possibile anche creare un oggetto dinamicamente: Studente *p = new Studente(23,"Rossi","Aldo"); A volte viene invocato il default constructor : Studente f; Il costruttore di default viene sempre invocato per array di oggetti Studente lista[120]; anche se si inizializzano chiamando esplicitamente il costruttore Studente lista[2] = Studente(543,"Rossi","Aldo"), Studente(544,"Verdi","Carla") ;

Il metodo Destructor Una volta che un oggetto viene creato invocando il suo Costruttore, il programma si prende la responsibilità di tenere traccia dell oggetto fino a quando deve essere eliminato. A questo punto viene invocato un metodo chiamato Distruttore che si occupa di liberare tutte le risorse occupate dall oggetto. nella maggior parte dei casi il Distruttore è vuoto ma nel caso in cui si creasse dinamicamente della memoria all interno del Costruttore, questa deve essere liberata nel Distruttore Studente::Studente( int c, const char * cg, const char * nm) int n = strlen( cg ); cognome = new char[ n+1 ]; std::strncpy( cognome, cg, n ); cognome[n] = \0 ;... Studente::~Studente( ) delete [] cognome;... La Classe Studente rivista (2) // Dichiarazione Classe Studente #include <cstring> class Studente private: int matricola; char * nome; char * cognome; int anno_corso; int cfu_acquisiti; public: Studente( ); Studente(int matr, const char * cognome, const char * nome); ~Studente( ); void registra_esame( int cfu ); int get_matricola( ); int get_cfu( ); void stampa_sommario( ); ;

// Esempio di utilizzo della classe Studente Studente iscritto cognome: Rossi nome: Aldo int main( ) matricola: 5432 anno di corso: I using namespace std; CFU superati: 0 Dopo il primo esame - CFU: 12 Studente aldo( 5432, "Rossi", "Aldo" ); cout << "Studente iscritto" << endl; aldo.stampa_sommario( ); // Registra Sperimentazioni I aldo.registra_esame( 12 ); cout << "Dopo il primo esame -"; << "CFU: " << aldo.get_cfu( ) << endl; return 0;