Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria Informatica, Gestionale e dell’Automazione Lezione 3 Funzioni e sovraccaricamento Overloading Il sovraccaricamento (overloading) consiste nel definire, nello stesso campo di azione, funzioni con lo stesso nome ma liste di parametri differenti Generalmente le funzioni svolgono una operazione comuni e possono essere applicate a parametri di diverso tipo int max(int, int); int max(const vector<int>&); int max(const int[], int n); Come sovraccaricare una funzione Dichiarazioni successive di una funzione con stesso nome e valore di ritorno, ma differenti parametri, sono overloading Se coincidono anche i parametri, la seconda definizione ridefinisce la prima Se nome e parametri coincidono, ma differisce il tipo di ritorno, viene presa come un errore di dichiarazione Sovraccaricamento e campo d’azione Le funzioni sovraccaricate sono definite nello stesso campo d’azione Una funzione locale non sovraccarica, ma nasconde una funzione globale Risoluzione del sovraccarico Quando viene chiamata una funzione sovraccaricata Le funzioni candidate sono l’insieme delle funzioni sovraccaricate Stesso nome della funzione chiamata Numero di parametri almeno pari al numero di argomenti Esistono delle conversioni per trasformare ogni argomento nel tipo del parametro corrispondente Le funzioni utilizzabili sono quelle che possono essere utilizzate con il numero e il tipo degli argomenti della chiamata La miglior funzione utilizzabile è quella che corrisponde meglio alla chiamata Le conversioni necessarie sono le meno peggio Argomenti di default Una funzione può essere dichiarata con dei valori di default per alcuni parametri int moltiplica(int a, int b = 5) { return a * b; } cout << moltiplica(2, 3); // 6 cout << moltiplica(2); // 10 Argomenti di default e overloading void ff(int); void ff(long, int = 0); ff(2L); // ff(long, 0) ff(0, 0); // ff(long, int) ff(0); // ff(int) ff(3.14); // errore di compilazione: entrambe possono corrispondere all’argomento con una conversione standard Corrispondenza di argomenti Alcune conversioni banali sono considerate corrispondenze esatte Conversioni con promozione Nome di array in puntatore Nome di funzione in puntatore a funzione T in const T Interi: da bool, char, short, unsigned a int Virgola mobile: da float a double, da double a long double Conversioni standard Da un tipo intero, virgola mobile o enum ad un tipo intero o virgola mobile Da un puntatore qualsiasi a void * (puntatore generico) Da un tipo intero, virgole mobile o enum a bool