costruttori e distruttori



Похожие документы
I puntatori e l allocazione dinamica di memoria

Funzioni in C. Violetta Lonati

Le operazioni di allocazione e deallocazione sono a carico del sistema.

Inizializzazione, Assegnamento e Distruzione di Classi

Allocazione dinamica della memoria - riepilogo

strutturare dati e codice

Java: Compilatore e Interprete

Visibilità dei Membri di una Classe

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica


Informatica 3. LEZIONE 7: Fondamenti di programmazione orientata agli oggetti (1)

Introduzione alla programmazione in C

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

puntatori Lab. Calc. AA 2007/08 1

Le funzioni in C. I programmi C sono costituiti da definizioni di variabili e funzioni.

Oggetti Lezione 3. aspetti generali e definizione di classi I

Appunti tratti dal videocorso on-line di Algoritmi e Programmazione Avanzata By ALeXio

Generalizzazione di funzioni e di classi. Macro come funzioni generiche

Sottoprogrammi: astrazione procedurale

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

Concetto di Funzione e Procedura METODI in Java

Grammatica di base: Pointers

VARIABILI LOCALI E GLOBALI (ESTERNE)

Gestione Risorse Umane Web

Realizzazione di una classe con un associazione

Utilizzo e scrittura di classi

Introduzione al linguaggio C Gli array

La gestione della memoria

Algoritmi di Ricerca. Esempi di programmi Java

La prima applicazione Java. Creazione di oggetti - 1. La prima applicazione Java: schema di esecuzione. Gianpaolo Cugola - Sistemi Informativi in Rete

Introduzione a Classi e Oggetti

dall argomento argomento della malloc()

Gestione dei File in C

Lezione 9: Strutture e allocazione dinamica della memoria

Variabili e tipi di dato

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

Liberare la memoria allocata dinamicamente.

La struttura dati ad albero binario

Record in C: il costruttore struct.

Introduzione al Linguaggio C

I database relazionali (Access)

Introduzione. Java. Composizione. Esempio -- composizione. G. Prencipe È qualcosa che abbiamo già visto varie volte

Il tipo di dato astratto Pila

Modulo 4: Ereditarietà, interfacce e clonazione

Fondamenti di Informatica T-1, 2009/2010 Modulo 2 Prova d Esame 5 di Giovedì 15 Luglio 2010 tempo a disposizione 2h30'

INFORMATICA - I puntatori Roberta Gerboni

Eredità in C++ Corso di Linguaggi di Programmazione ad Oggetti 1. a cura di Giancarlo Cherchi

GESTIONE INFORMATICA DEI DATI AZIENDALI

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

Esercizi sulla definizione di classi (Fondamenti di Informatica 1 Walter Didimo) Soluzioni

Prossime lezioni. Dai TDA agli oggetti. Riassunto. Riassunto TDA. Oggi. Stefano Mizzaro 1

Le Liste. Elisa Marengo. Università degli Studi di Torino Dipartimento di Informatica. Elisa Marengo (UNITO) Le Liste 1 / 31

Automatizzare i compiti ripetitivi. I file batch. File batch (1) File batch (2) Visualizzazione (2) Visualizzazione

Programmazione in Java Parte I: Fondamenti

Capitolo Quarto...2 Le direttive di assemblaggio di ASM Premessa Program Location Counter e direttiva ORG

I file di dati. Unità didattica D1 1

Architettura dei calcolatori e sistemi operativi. Assemblatore e Collegatore (Linker) Capitolo 2 P&H Appendice 2 P&H

Struttura a record. File ad accesso diretto. Modalità di apertura. Modalità di apertura

Riccardo Dutto, Paolo Garza Politecnico di Torino. Riccardo Dutto, Paolo Garza Politecnico di Torino

Relazioni tra oggetti e classi : Composizione. Relazioni tra oggetti e classi : esempio di Aggregazione. classe contenitore

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

ARRAY BIDIMENSIONALI float [][] mx = new float[3][4]; (float []) [] mx = new float[3][4];

Prova di Laboratorio di Programmazione

void funzioneprova() { int x=2; cout<<"dentro la funzione x="<<x<<endl; }

Struttura di un programma Java

Esercitazione n 4. Obiettivi

Linguaggio C - Stringhe

10 - Programmare con gli Array

MANUALE PARCELLA FACILE PLUS INDICE

Dynamic Linking. Introduzione Creazione di una libreria dinamica Uso di una libreria dinamica

Università degli Studi di Cassino Corso di Fondamenti di Informatica Puntatori. Anno Accademico 2010/2011 Francesco Tortorella

PROGRAMMA SVOLTO DI INFORMATICA ANNO SCOLASTICO 2013/2014. DOCENTE: Villani Chiara

Compito di Fondamenti di Informatica

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Regione Toscana. ARPA Fonte Dati. Manuale Amministratore. L. Folchi (TAI) Redatto da

Il simulatore SPIM SPIM

Laboratorio di Algoritmi e Strutture Dati

Guida rapida per i docenti all'uso della piattaforma di e-learning dell'istituto Giua

Le stringhe. Le stringhe

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2011

MANUALE PORTALE UTENTE IMPRENDITORE

Corso di Fondamenti di Informatica

Sistemi Operativi. Interfaccia del File System FILE SYSTEM : INTERFACCIA. Concetto di File. Metodi di Accesso. Struttura delle Directory

GESTIONE DEI PROCESSI

Quotazione compareto( ) Quotazione piurecente( ) Quotazione Quotazione Quotazione non trovato count( )

Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 17 Dicembre 2005

Cosa è un foglio elettronico

Laboratorio di Algoritmi e Strutture Dati

Esercitazioni di Progettazione del Software. Esercitazione (Prova al calcolatore del 17 settembre 2010)

Транскрипт:

costruttori e distruttori

Costruttore E un metodo che ha lo stesso nome della classe a cui appartiene: serve per inizializzare un oggetto all atto della sua creazione Ce ne possono essere uno, più di uno, nessuno Può avere un numero qualunque di argomenti, ma nessun valore di ritorno Non viene chiamato direttamente. Viene eseguito automaticamente alla creazione di un oggetto programmazione ad oggetti 2

Costruttore class Rettangolo { ; private: int base; int altezza; public: Rettangolo(int,int); Dichiariazione di di un un costruttore Rettangolo::Rettangolo(int b,int a) { base=b; altezza=a; Definizione del costruttore programmazione ad oggetti 3

Costruttore #include <Rettangolo.h>. void main() { La La creazione di di un un oggetto Rettangolo ha ha ora bisogno di di due parametri che inizializzano gli gli attributi interni del nuovo oggetto Rettangolo r(10,20); Rettangolo *rp=new Rettangolo(20,30); programmazione ad oggetti 4

Distruttore E un metodo avente il nome della classe a cui appartiene preceduto da ~ Ce ne può essere al massimo uno Non viene chiamato direttamente. È eseguito automaticamente quando viene liberata una area di memoria che contiene un oggetto della classe Non può accettare parametri né avere valori di ritorno programmazione ad oggetti 5

Distruttore class Rettangolo { ; public: ~Rettangolo(); Dichiarazione del distruttore Rettangolo::~Rettangolo() { cout << Addio mondo crudele ; Definizione del distruttore Constructor1.cppcpp programmazione ad oggetti 6

Scope & Initialization Si può dichiarare una variabile in qualunque parte di un blocco (non solo all'inizio) Il costruttore viene attivato in corrispondenza della dichiarazione Il distruttore viene attivato quando l'esecuzione lascia l'ambito di validità della variabile (out of scope) programmazione ad oggetti 7

Initialization & Scope Indicazione di stile: Ridurre al minimo necessario lo scope (dichiarazione al primo uso, es. for) Non si può inserire una definizione di variabile con costruttore in una parte di codice eseguita sotto condizione. programmazione ad oggetti 8

Allocazione statica In C++ l allocazione statica per le variabili viene effettuata quando si incontra la dichiarazione della variabile. Quando il compilatore trova: Poligono triangolo; provvede a inserire nel codice oggetto le istruzioni per riservare lo spazio di memoria relativo programmazione ad oggetti 9

Allocazione dinamica L allocazione dinamica viene effettuata tramite l operatore new che alloca una nuova area di memoria durante l esecuzione. L area di memoria allocata dinamicamente non ha un nome associato, ma viene utilizzata tramite puntatori La memoria deve essere rilasciata esplicitamente quando non serve più tramite l operatore delete programmazione ad oggetti 10

Allocazione dinamica Nel caso di oggetti allocati dinamicamente: Poligono* ppol; ppol=new Poligono; alloca un oggetto dinamicamente. Notare che la notazione per mandare messaggi ad un oggetto tramite un puntatore ad esso è uguale a quella per accedere ai campi di una struttura tramite puntatore: si usa l operatore -> programmazione ad oggetti 11

Allocazione dinamica class Stringa{ char * str; public: Stringa(int ); ~Stringa(); Stringa::Stringa(int size) { str = new char[size+1]; *str = \0 ; Stringa::~Stringa() { delete [] str; creazione del vettore di char e inizializ. alla stringa vuota programmazione ad oggetti 12

esempio: Stash class Stash { public: Stash(int size); ~Stash(); Stash::Stash(int sz) { size = sz; quantity = 0; storage = 0; next = 0; Sostituiscono Initialize() e Cleanup() Stash3.h Stash3.cpp Stash::~Stash() { if(storage!= 0) { cout << "free "; delete []storage; programmazione ad oggetti 13

esempio: Stash int main() { Stash intstash; intstash.initialize(sizeof(int)); Stash stringstash; const int bufsize = 80; stringstash.initialize(sizeof(char) * bufsize); intstash.cleanup(); stringstash.cleanup(); int main() { Stash intstash(sizeof(int)); Stash stringstash(sizeof(char) * bufsize); Stash3Test.cpp programmazione ad oggetti 14

esempio: Stack class Stack { struct Link { Link(void* dat, Link* nxt); ~Link(); public: Stack(); ~Stack(); Stack::Link::Link(void* dat, Link* nxt) { data = dat; next = nxt; Stack::Link::~Link(){ Stack2.h Stack2.cppcpp Stack::Stack() { head = 0; Stack::~Stack() { require(head == 0, "Stack not empty"); void Stack::push(void* dat){ head = new Link(dat,head); programmazione ad oggetti 15

Inizializzazione di aggregati Facilitazione sintattica per array & co. int a[3] = { 1, 2, 3 ; ma anche: int a[3] = {0; Aclass X[] = { {1,2,'a', {3,4,'b' ; se c'è un costruttore Bcls X[] = {Bcls(1,'a') Bcls(2,'b') Conteggio automatico: int a[] = { 1, 2, 3 ; quanti = sizeof a / sizeof *a ; Multiarg.cpp ma non sarà meglio essere espliciti? programmazione ad oggetti 16

Quali nomi? Name decoration: il completamento automatico dei nomi fatto dal compilatore per evitare conflitti: nome globale: void f(); --> _f nome locale: class X { void f(); ; --> _X_f programmazione ad oggetti 17

Nomi completi In C++ la name decoration comprende anche i tipi degli argomenti: nome globale: void f(int); --> _f_int nome locale: int X::f(int){ ; --> _X_f_int nome sovradefinito (overloaded): int X::f(float){ ; --> _X_f_float programmazione ad oggetti 18

Overloading di costruttori L'overloading è particolarmente utile per i costruttori - più modi di inizializzare: Senza argomenti: AClass::AClass(){ a=0; x=0; ; Con argomenti: AClass::AClass(int A, int X){ a=a; x=x; ; AClass::AClass(int A){ a=a; x=0; ; il contesto decide quale si usa: AClass Prova; AClass Test(1); AClass Pippo(1,2); programmazione ad oggetti 19

esempio: Stash Stash3.cpp class Stash { public: Stash(int size); Stash(int size, int initquantity); ~Stash(); Stash::Stash(int sz, int initquantity) { size = sz; quantity = 0; storage = 0; next = 0; inflate(initquantity); Stash3.h Inizializza e crea elementi int main() { Stash intstash(sizeof(int)); Stash stringstash(sizeof(char) * bufsize, 100); Stash3Test.cpp programmazione ad oggetti 20

Argomenti di default Il codice dei due costruttori è quasi uguale Funzioni con argomenti di default (dichiaraz.) int UnaFunzione(int a, int b = 0); Stash(int size, int initquantity = 0); Regola per gli argomenti opzionali: solo gli ultimi int F1(int a, int b=0, int c=0, int d=0); int F1(int a=0, int b, int c, int d); int F1(int a, int b=0, int c, int d=0); Un solo costruttore! programmazione ad oggetti 21

Overloading o Default? La scelta dipende da: quanto si differenziano le funzioni quanto si vogliono evidenziare usi diversi In alcuni casi l'inizializzazione con valori di default non è la stessa cosa dell'inizializzazione senza argomenti programmazione ad oggetti 22

esempio: Mem class Mem { byte* mem; int size; void ensureminsize(int minsize); public: Mem(); Mem(int sz); ~Mem(); int msize(); byte* pointer(); byte* pointer(int minsize); byte* Mem::pointer() { return mem; byte* Mem::pointer(int minsize) { ensureminsize(minsize); return mem; Mem::Mem() { mem = 0; size = 0; Mem::Mem(int sz) { mem = 0; size = 0; ensureminsize(sz); class Mem { public: Mem(int sz=0); byte* pointer(int minsize=0); programmazione ad oggetti 23

esempio: Mem class MyString { Mem* buf; public: MyString(); MyString(char* str); ~MyString(); void concat(char* str); void print(ostream& os); ; MyString::MyString() { buf = 0; MyString::MyString(char* str) { buf = new Mem(strlen(str) + 1); strcpy((char*)buf->pointer(),str); MyString(char* str=0); ne vale la pena? MyString::MyString(char* str) { if (!*str) { buf=0; return; buf = new Mem(strlen(str) + 1); strcpy((char*)buf->pointer(),str); programmazione ad oggetti 24

esercizio (7.1) Creare una classe Text che contenga un oggetto String in cui memorizzare il contenuto di un file di testo. Definire due costruttori: un costruttore di default e uno che prenda come argomento una String (nome del file da leggere). Il secondo costruttore apre il file e ne legge il contenuto nella variabile privata String. Aggiungere un metodo contents() che ritorna il contenuto della variabile privata. Da main, creare un oggetto definendo un oggetto di classe Text e visualizzare il contenuto del file letto. programmazione ad oggetti 25