Grammatica di base: Pointers Esistono I puntatori a funzioni. Bisogna esplicitare esattamente il tipo di ritorno e il tipo di argomento. Per evitare ambiguità con il prefisso * nel declarator, il nome e l operatore va incluso tra parentesi tonde: int *dn (int); // Funzione che ritorna un puntatore ad un intero ed ha come argomento un intero int (*dn)(int); // Puntatore ad una funzione che ritorna un intero ed ha come argomento un intero F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXII ciclo 63
Grammatica di base: Pointers Si può applicare & al nome o usare il nome direttamente: int do_nothing(int a); int (*dn) (int); int main() { int a=2; dn=&do_nothing; dn=do_nothing; return dn(a); } Molto utili per definire menù usando array di funzioni: typedef void (*FILE ) (); FILE edit_ops[]={&cut,&paste,©,&search FILE file_ops[]={&open,&append,&close,&write FILE *button2=edit_ops; FILE *button3=file_ops; button2[2](); F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXII ciclo 64
Grammatica di base: References Reference Una reference è un nome alternativo per un oggetto. La notazione: T& vuol dire: reference a T int i=2: int &ref=i: int a=ref; ref=2; Per assicurarsi che la reference punti a qualche cosa è obbligatorio inizializzarla: int i=0; int & ref=i; //Permesso int & ref: // Non è permesso, non punta a niente, non è inizializzata extern int &ref2; // Permesso, deve essere inizializzata da qualche altra parte. Non ci sono operatori che operino direttamente sulla reference: ref++; // Somma +1 all oggetto puntato dalla reference Viene utilizzata per passare parametri che possono essere modificati, a funzioni o per tipi di ritorno di operatori. Per migliorare la leggibilita dei programma e preferibile usare puntatori piuttosto che reference, negli argomenti delle funzioni. F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXII ciclo 65
Grammatica di base: References void modify_it(int &a){a++;} void f(){ int x=1; modify_it(x); // Non si capisce che x viene modificata } int incr(int a) {return a+1;} void sum_it(int *a){ (*a)++;} void f(){ int x=1; x=incr(x); // x=2 sum_it(&x); // x=3, si capisce che viene modificata perchè si passa il puntatore } F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXII ciclo 66
Funzionalità avanzate: Tipi aggregati Le strutture. Un array è un aggregato di tipi tutti uguali. Una struttura: struct, è un aggregato di tipi diversi. struct studente { char * name; int anno_dott; bool buoni_e_cattivi; bool corso_cpp; Si dichiara come gli altri tipi, usando il nome della definizione: studente f_cafagna; F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXII ciclo 67
Funzionalità avanzate: Tipi aggregati Si inizializza come i vettori: studente f_cafagna={ Francesco Cafagna,1,TRUE,TRUE Come posso accedere ai membri individuali di una struttura? Si usa l operatore :. (punto) std::cout << f_cafagna.name << std::endl; E se usassi un puntatore ad una struttura? Al punto va sostituito l operatore: -> (structure pointer dereference) void Print_student_name( studente *s){ std::cout << s->name << std::endl; } Attenzione al ; F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXII ciclo 68
Funzionalità avanzate:tipi aggregati È possibile assegnare strutture, passarle come argomenti e ritornarle come risultati di una funzione Non sono definite a priori le operazioni, vanno definite Il nome di un tipo si può usare appena diventa disponibile: struct test { test* prova; test* riprova; Perchè non è possibile scrivere: struct test { test prova; test riprova; F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXII ciclo 69
Funzionalità avanzate:tipi aggregati E questo : struct prova2; struct test{ prova2 sbagliato; test *corretto; F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXII ciclo 70
Funzionalità avanzate: Tipi aggregati Unions. Sono struct i cui membri hanno tutti lo stesso indirizzo di memoria. Le dimensioni saranno quelle del membro più grande: union test { char* t; int s; test prova; prova.t= y ; std::cout << prova.s << std::endl; F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXII ciclo 71
Funzionalità avanzate:tipi aggregati In C++ si possono usare unions anonime: struct esempio{ char *name; My_type t; union { char *s; int t; F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXII ciclo 72
Funzionalità avanzate: function overloading Spesso diamo alle funzioni nomi differenti ma effettuano le stesse operazioni su tipi diversi. Dare lo stesso nome ad operazioni effettuate su tipi diversi è detto: overloading. Secondo voi come fa l operatore + ad operare su diversi tipi chiamandosi nello stesso modo? void Voglio_la_millefoglie(fragole *f); void Voglio_la_millefoglie(frutti_di_bosco *f); void Voglio_la_millefoglie(cigliege *f); void Voglio_la_millefoglie(pesche *f, bool no_chantilly); F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXII ciclo 73
Funzionalità avanzate: Templates Il C++ supporta il generic programming, ovvero permette che un tipo sia usato come parametro di una classe o una funzione: template<class T> struct Pere{ T variabile_generica; T* puntatore_generico; template<class C> C do_nothing(c a){ return a++;} Si possono definire funzioni template overloaded: template<class T> T sqrt(t); template<class T> complex<t> sqrt(complex<t>); F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXII ciclo 74
Funzionalità avanzate: Templates Come si instanziano? Pere <int> kaiser; int a; do_nothing(a); Un template può usare parametri: template <class S, int n> struct Pere{ S v[n]; Pere<int,5> Williams; Parametri possono essere: costanti, address di oggetti o funzioni esterne, o puntatori a membri non-overloaded. F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXII ciclo 75
Funzionalità avanzate: S(T)L Il C++ viene fornito con una Standard Library. la Standard Library viene definita nel namespace std, e contiene strumenti per: Run-time language support (typeid, memory operation, etc.) La C standard library (printf, scanf, etc. ) Stringhe e I/O streams (string, cout, cin, etc.) Supporto per calcolo numerico (complex, etc.) Contenitori (Containers) ed algoritmi che li utilizzano (vector, list, map, iterator, for_each, etc.) Utilizza pesantemente I templates F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXII ciclo 76
Funzionalità avanzate: S(T)L Abbiamo già usato la libreria per I/O: iostream cout: definisce un output per ogni tipo; cin: definisce un input per ogni tipo; Si specializza per I/O su file usando: fstream,ofstream, ifstream Su stringhe: sstream, istringstream, ostringstream Contenitori: vector : array dinamico. Non ha dimensione fissa. Templates. vector <int> caf; for(int a=0;a<10;++a){ caf.push_back(a); } std::cout << Dim. : << caf.size() << std::endl; Templates Dinamico. Cresce alla bisogna Chiedo al vector le dimensioni F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXII ciclo 77
Funzionalità avanzate: S(T)L È possibile navigare in un vettore usando l operatore: [] vector<pere> kayser; for(int i=0; i< kayser.size; ++i) do_nothing(kayser[i]); È possibile navigare in un vettore usando degli: iteratori. Oggetti che sanno come spostarsi in un vettore: vector<pere> kayser; for(vector<pere>::const_iterator i=kayser.begins(); i!= kayser.end(); ++i) do_nothing(*i); F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXII ciclo 78
Funzionalità avanzate: S(T)L Facciamo un pò di esempi: test_union F.S. Cafagna, Linguaggi di programmazione avanzati: C++, XXII ciclo 79