Le classi. Costruttori

Documenti analoghi
Esercizi. Cosa fa questa linea di codice: while (*a++=*b++); Costruiamo una funzione che la utilizzi (hint. Usiamo I char..)

Grammatica di base: esempio

La programmazione ad oggetti (OOP)

Il paradigma OO e le Classi

Le classi. Classi derivate

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

Grammatica di base: Pointers

Grammatica di base. Si chiama: main Non prende nessun argomento Non fa niente Ritorna un intero al sistema

Oggetti. Definizioni di Classi II

Programmazione a Oggetti Lezione 8. Definizioni di Classi II

Laboratorio di Algoritmi e Strutture Dati. Esercizi

Programmazione ad oggetti

Laboratorio di programmazione

Grammatica di base. Casting

La programmazione ad oggetti (Parte 1)

Lezione 4. Costruttori

Strutture come parametri di funzioni

AGGIORNAMENTI RECENTI IN C++ Programmazione ad Oggetti Corso di Laurea in Informatica Università della Calabria

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

I costruttori. Il costruttore standard. Esempio di valori di default. Alterare il costruttore standard

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

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

C++ funzioni Alberto Ferrari. Alberto Ferrari Programmazione di applicazioni SW

Introduzione alla programmazione in C

Il linguaggio C. Puntatori e dintorni

Overloading degli operatori

Sommario. Esempio. Esempio: Canzone.h #ifndef CANZONE_H #define CANZONE_H. Esempio: Canzone.cpp

Ancora sulle Classi in C++ e Java. this

14 - Metodi e Costruttori

Costruttori/distruttori. Sovraccarico degli operatori. Costruttori/distruttori. Necessità di un cotruttore

Introduzione al C++ (continua)

costruttori e distruttori

Definizione di classi. Walter Didimo

Introduzione al linguaggio C Puntatori

Introduzione al C++ Parte 2

Variabili e Parametri. Scope, Lifetime Inizializzazione

Variabili e Parametri

Overloading di Operatore

Variabili e Funzioni. Informatica 1 / 19

Array di array. Walter Didimo

Programmazione in Java (I modulo) Lezione 20: Ereditarietà

C++11. Michelangelo Diligenti Ingegneria Informatica e dell'informazione.

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

Ambienti di Programmazione per il Software di Base

Programmazione template

Oggetti e classi. La classe è un modello (un contenitore) che definisce la forma di un oggetto, specificando:

Funzioni, Stack e Visibilità delle Variabili in C

Programmazione II. Lezione 23. Daniele Sgandurra 28/1/2011.

Programmazione Java Struttura di una classe, Costruttore, Riferimento this

Informatica e Laboratorio di Programmazione C++ Object Oriented Programming Alberto Ferrari

Programmazione Java Struttura di una classe, Costruttore, Riferimento this

Corso di Informatica A.A

Ereditarietà gerarchica

Introduzione al linguaggio C Puntatori

Modello procedurale versus modello O-O

Laboratorio di Algoritmi e Strutture Dati

Le Funzioni in C. Fondamenti di Informatica Anno Accademico 2010/2011. Corso di Laurea in Ingegneria Civile Politecnico di Bari Sede di Foggia

Indice. Il qualificatore const Le funzioni friend Il puntatore this Gli operatori new e delete I membri static La composizione di classi

Introduzione al linguaggio C Dati aggregati

Esercitazioni sulle classi

Fondamenti di Informatica T-1

Fondamenti di Informatica

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

Dal C al C++ Corso di Linguaggi di Programmazione ad Oggetti 1. a cura di Giancarlo Cherchi

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

Indirizzi e tipi puntatore a

C: panoramica. Violetta Lonati

Laboratorio di Programmazione: Linguaggio C Lezione 21 del 19 maggio 2014

Programmazione I Prova scritta - 10 gennaio h20min

Laboratorio di Algoritmi e Strutture Dati

L AMBIENTE CODE BLOCKS E L IO

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

#include <iostream> #include <cstring> #include <fstream> using namespace std; struct elem{ char parola[31]; elem *pun; };

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

C funzioni à scope di variabili

Puntatori e array. Violetta Lonati

Modulo 2: Strutture fondamentali della programmazione Java

String. String: Esercizio 1

Programmazione Procedurale in Linguaggio C++

Programmazione orientata agli oggetti. Ivan Lanese

Dati aggregati. Violetta Lonati

Informatica/ Ing. Meccanica/ Ing. Edile/ Prof. Verdicchio/ 05/02/2014/ Foglio delle domande / VERSIONE 1

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

Introduzione al polimorfismo. Il polimorfismo è la possibilità di utilizzare una unica interfaccia per più metodi

Inizializzazione, Assegnamento e Distruzione di Classi

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Ingegneria Elettronica Ingegneria delle Telecomunicazioni (J-Z) Ing. Antonio Monteleone A.A. 2001/02 3 ciclo

INPUT: 2 parametri. double atan2( double y, double x) OUTPUT: risultato del calcolo. Le funzioni. Implementazioni di funzioni dell utente

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

Metodi. Un metodo è una porzione di codice a cui si associa un nome. Un istruzione eseguita da un metodo può essere:

Il linguaggio C++ Ugo de Liguoro

I numeri razionali. Specifica: la sintassi. Specifica: la semantica

Laboratorio di Informatica I

Funzioni, Stack e Visibilità delle Variabili in C

Laboratorio di Programmazione aa 2012/2013 Riferimenti, Costruttori, Distruttori, Assegnazione

Programmazione M.A. Alberti. Comunicazione digitale AA 2009/ Classi in Java 1. Le classi in Java. Oggetti. Classi. Classi. Visibilità dei dati

Transcript:

Costruttori Le classi Usare una funzione per inizializzare membri di una classe viene considerato poco elegante. Ci si potrebbe dimenticare di invocare la funzione di inizializzaione o, peggio, chiamarla più volte. Il C++ permette di dichiarare una funzione che abbia l esplicito compito di inizializzare oggetti: il costruttore. Il costruttore si riconosce perchè ha lo stesso nome della classe Se una classe è dotata di costruttore tutti gli oggetti di quel tipo verranno inizializzati. F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXIII ciclo 194

studente.h #ifndef STUDENTE_H #define STUDENTE_H #include <string> using std::string; struct studente { studente(string n) {nome=n; anno_dott=0; corsi_seguiti=0; buoni_e_cattivi=true;} studente(string n,int ad) {nome=n; anno_dott=ad; corsi_seguiti=0; buoni_e_cattivi=true;} string nome; int anno_dott; bool buoni_e_cattivi; int corsi_seguiti; void Print_student_name( ); void Set_Name( const string & n) ; void Add_corsi( ) ; }; #endif //STUDENTE_H Costruttore ha lo stesso nome della classe, i.e. del tipo Inizializza i membri e compie azioni necessarie alla corretta creazione in memoria dell oggetto Costruttori non di default, i.e. posso passare parametri con valori F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXIII ciclo 195

Costruttori Scrivo un metodo con lo stesso nome della classe, ovvero del tipo base, senza tipo di ritorno Elenco eventuali parametri di input Dopo l operatore funzionale (i.e. ( ) elenco le inizializzazioni dei membri usando la forma funzionale. L elenco è preceduto da : e la lista e separata da, Dopo l elenco di inizalizzazioni creo lo scope del costruttore scrivendo il codice da eseguire quando il costruttore viene invocato (i.e. {}) studente(){name= no name ; anno_dott=0; corsi_seguiti=0; buoni_e_cattivi=true;} studente(string n) {name=n; anno_dott=0; corsi_seguiti=0; buoni_e_cattivi=true;} studente(string n,int ad) {name=n; anno_dott=ad; corsi_seguiti=0; buoni_e_cattivi=true;} F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXIII ciclo 196

Costruttori Le classi Se non specifico parametri all atto della creazione dell oggetto verrà invocato il costruttore di default studente nessuno; // Equivalente a:studente nessuno(); Se specifico parametri verrà invocato il costruttore che ha i tipi dei parametri corrispondenti studente cafagna( Francesco Saverio ); // Viene invocato:studente(string ) string nome( Francesco Saverio ); studente cafagna(nome,1); // Viene invocato:studente(string,int); F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXIII ciclo 197

Costruttori Le classi Essendo il costruttore una member function, anche se particolare, posso inizializzare i parametri formali all atto della loro dichiarazione: studente(sting n= no lastname, int i=1) : name(n), lanno_dottorato(i){}; studente primo(1); F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXIII ciclo 198

studente.h (Evitiamo la proliferazione di costruttori) #ifndef STUDENTE_H #define STUDENTE_H #include <string> using std::string; struct studente { studente(string,int, int, bool ); string nome; int anno_dott; bool buoni_e_cattivi; int corsi_seguiti; void Print_student_name( ); void Set_Name( const string & n) ; void Add_corsi( ) ; }; studente::studente(string n= none,int ad, int corsi=0, bool bc=true) {nome=n; anno_dott=ad; corsi_seguiti=corsi; buoni_e_cattivi=bc;} #endif //STUDENTE_H F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXIII ciclo 199

studente.h (Possiamo usare la forma funzionale) #ifndef STUDENTE_H #define STUDENTE_H #include <string> using std::string; struct studente { studente(string n= none,int ad, int corsi=0, bool bc=true) : nome(n), anno_dott(ad), corsi_seguiti(corsi), buoni_e_cattivi(bc){}; string nome; int anno_dott; bool buoni_e_cattivi; int corsi_seguiti; void Print_student_name( ); void Set_Name( const string & n) ; void Add_corsi( ) ; }; #endif //STUDENTE_H F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXIII ciclo 200

Distruttori Le classi Spesso così come una classe richiede delle operazioni al momento della inizializzazione, potrebbe richiedere delle azioni all atto della distruzione di un oggetto. Esiste questa posibilità complementare ai costruttori e viene attuata dai: distruttori Anche questi prendono il nome dalla classe ma preceduto dal simbolo di complemento: ~ ~ studente(){ std::cout << Distrutto tutto << std::endl; } F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXIII ciclo 201

Copia Gli oggetti di un ogni tipo di classe possono essere copiati: studente a( caf ); studente b=a; La copia copia ogni membro di una classe a meno che un costrutture di copia non sia stato definito: studente::studente(const studente &a) { name=a.name;} Member functions costanti Se una funzione non modifica i membri di una classe può essere definita in modo da essere invocata anche per un oggetto costante: void Print_student_name() const; void Print_my_student(const student &a ) { a.print_student_name();} F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXIII ciclo 202

this Le classi this ritorna il puntatore all oggetto la cui member function è stata chiamata Quindi in un member function di una class C, il tipo ritornato da this è: C * In un member function const di una class C, il tipo ritornato da this è: const C * studente * studente::where_in_memory(){ return this;} studente Cafagna( F S,1); std::cout << Locazione di memoria dell oggetto di nome Cafagna << Cafagna.where_in_memory() << endl; F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXIII ciclo 203

this Posso usare le member functions come lvalue? Mi basta ritornare solo la reference al tipo di cui fa parte? studente & aggiungi_corsi(int n){ corsi_seguiti+=n; return studente(name,anno_dottorato,corsi_seguiti,buoni_cattivi); } Occorre ritornare l oggetto stesso di cui la funzione è membro: this studente & aggiungi_corsi(int n){ corsi_seguiti+=n; return *this; } studente a( caf,5); a.aggiungi_corsi(2).print(); F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXIII ciclo 204

Operatori Se le classi hanno lo stesso supporto dei tipi base, come faccio ad usare le operazioni di base tra classi? Per esempio come posso scrivere? studente a( fra ),b( caf,2); if(a==b) { } Creo lo studente a e b come un tipo base Ma che vuol dire studente a è uguale a studente b? Occorre spiegare come sono fatte le operazioni che coinvolgono oggetti di una classe (o struttura), riscrivendo gli operatori dei tipi base: operator overloading. Per questo possiamo definire helper o member functions che ridefiniscano gli operatori. F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXIII ciclo 205

Operatori Posso ridefinire gli operatori: +, -, *, /, =, +=, -=, *=, /=, ++, -- <, >, ==,!=, <=, >=, &&, <<, >>, <<=, >>= %, &, ^,!,, ~, &=, ^=, =, %= [], (),, ->*, -> new, delete, new[], delete[] F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXIII ciclo 206

Operatori Per definire un operatore dobbiamo dichiarare una operator function. Questa altro non è che una funzione il cui nome è preceduto dal prefisso: operator. tipo operator sign (lista dei parametri) { /*...*/ } F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXIII ciclo 207

Operatori Le classi Per esempio definiamo == per la classe studente: class studente { bool operator == ( const studente & a){ return GetName() == a.getname(); } }; studente a( fra ),b( caf ); if(a==b) { } if(a.operator==(b)){ } Invoco direttamente l operatore! F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXIII ciclo 208

Operatori Definiamo == come helper function: class studente { }; bool operator == ( const studente & a, const studente & b){ return a.getname() == b.getname(); } studente a( fra ),b( caf ); if(a==b) { } if(operator==(a,b)){ } Invoco direttamente l operatore! F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXIII ciclo 209

Operatori Converrebbe minimizzare il numero di operatore dichiarati in una classe e limitarli a quelli che necessitano di operare sulla rappresentazione: class simple { public: simple(int a=0, int b=0): _a(a), _b(b) {}; ~simple() { std::cout << Ciao ciao << std::endl; } int Get_a(){ return _a;} int Get_b(){ return _b;} void Print() {std::cout << Simple : a << _a <<, b << _b << std::endl; } simple& operator+=(simple not_a) { std::cout << Sono in simple += simple << std::endl; _a+=not_a.get_a(); return *this; } simple& operator+=(int a) { std::cout << Sono in simple += int << std::endl; _a+=a; return *this; } private: int _a,_b; }; F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXIII ciclo 210

Operatori Le classi simple operator+(simple a, simple b) { simple temp=a; return temp.operator+=(b); } simple operator+(simple a, int b) { simple temp=a; return temp+=b; } F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXIII ciclo 211