Sei sulla pagina 1di 18

Universit di Napoli Federico II - Dip.

di Ingegneria Elettrica e delle Tecnologie dellInformazione


Corso di Laurea in Ingegneria Informatica

Corso di Programmazione I

Funzioni: aspetti avanzati

Le funzioni





Gli argomenti di default


Loverloading delle funzioni
Le funzioni inline
I riferimenti e il passaggio per riferimento

Gli argomenti di default 1/2







Alcune funzioni vengono chiamate specificando lo


stesso valore per un dato parametro effettivo , in
questo caso potrebbe essere utile poter chiamare
la funzione utilizzando tale valore come default
In questo caso lutente pu invocare la funzione
omettendo di specificare il parametro effettivo per il
quale stato previsto un valore di default
Gli ultimi (oppure tutti) parametri di una lista
possono avere dei valori di default
E il prototipo che deve specificare gli argomenti di
default

Gli argomenti di default 2/2




Occorre prestare attenzione a possibili errori, perch


la corrispondenza parametro effettivo-parametro
formale resta sempre posizionale!!!:
void abc(int x, int y=1, char *p="hello");
.
void xyz() {
Il compilatore
abc(1, "yahtzee!");
associa
}
"yahtzee!" al
parametro y
e segnala un
errore

Loverloading delle funzioni 1/4




In C++, possibile dare a funzioni diverse lo stesso


nome, a condizione che le funzioni abbiano liste di
parametri diverse (in numero e/o tipo)
Il compilatore in grado di associare in modo univoco
ciascuna chiamata a una delle funzioni, distinte in base
della lista degli argomenti
// versione A
void incr(int *v) {
*v++;
}
// versione C
void incr(float *v) {
*v = *v + 1.0;
}

// versione B
void incr(int *v, int dx) {
*v += dx;
}

float x=0.;
incr(&x); // viene invocata
// la versione C

Loverloading delle funzioni 2/4




Avere tipi di ritorno diversi non sufficiente a


distinguere le funzioni
Nellistruzione di chiamata infatti pu non essere
evidente il tipo del valore di ritorno
Un uso poco attento dei parametri di default pu
creare delle ambiguit!
void ovl(char=a);
???
void ovl(int=0);

incr();

Loverloading delle funzioni 3/4




Quando uno stesso nome corrisponde a pi


funzioni, si dice che tale nome sovraccaricato
(overloaded) di significato
Firma (signature) di una funzione:
nome + tipo dei parametri

In presenza della chiamata di una funzione


overloaded, il compilatore riconosce quella che
(meglio) si adatta alla chiamata (occhio alle
conversioni implicite di tipo!)
N.B. Il tipo restituito non fa parte della firma della
funzione!

Loverloading delle funzioni 4/4




Loverloading delle funzioni si usa:




Quando si devono definire funzioni concettualmente


simili da applicare a dati di tipo diverso

e


Lalgoritmo realizzato da ciascuna funzione


anchesso diverso a seconda dei tipi di dato a cui la
funzione deve essere applicata

Funzioni inline 1/3







Le funzioni inline sono funzioni le cui chiamate, per


motivi di efficienza, non sono tradotte in linguaggio
macchina dal compilatore mediante salto a
sottoprogramma (con relativo scambio parametri)
il codice della funzione viene inserito in linea, cio nel
punto della chiamata
Luso delle funzioni inline deve essere limitato a
funzioni dal corpo molto breve (poche istruzioni),
altrimenti
 il miglioramento del tempo di esecuzione irrilevante
 laumento della dimensione del codice pu essere
notevole

Funzioni inline 2/3




Le funzioni inline devono essere definite nello stesso


file in cui sono invocate, ovvero in un file di intestazione
(header file) da importare, perch il compilatore deve
conoscerne il corpo per sostituirlo ad ogni chiamata
 non sempre una funzione inline viene sviluppata in
linea dal compilatore
 non pu essere esportata ( sempre a collegamento
interno)
 Una funzione inline pu specificare argomenti di default

Funzioni inline 3/3




Il qualifiicatore inline specificato prima del tipo di


ritorno della funzione, una indicazione per il
compilatore
inline int plusOne(int x=0) { return ++x; }
int main()
{
cout <<"\n inline:"<<plusOne();
system("PAUSE");
return 0;
}

Riferimenti (in C++)




In alcuni linguaggi riferimento un sinonimo


di puntatore
In C++ riferimento un identificatore che
individua lindirizzo di una variabile
E un modo per dare pi nomi ad una stessa
variabile, cio un alias

Riferimenti






Come un puntatore cos anche un riferimento deve essere definito


in relazione ad un tipo
Definizione di un riferimento:
T & r;
Un riferimento deve essere inizializzato e non pu essere
modificato
Attraverso di esso pu per essere modificato il valore
delloggetto riferito
int i,x;
int & j=i;
const int & y=x;
j=10;
j=x; //errore!
y=5; //errore!

00010100
00011100
00010101

01010100

int i=3,x=5;
// due variabili intere i e x
int & j=i;
// j un riferimento ad i
int & q=x;
// q un riferimento ad x
const int & y=x; // y un riferimento ad x, x non pu essere modificata
attraverso y
cout << "x: " << x << " i: " << i << endl;
cout << "q: " << q << " j: " << j << endl;
j=10;
q=-2;

// modifico la variabile i attraverso il riferimento j

cout << "x: " << x << " i: " << i << endl;
cout << "q: " << q << " j: " << j << endl;
//j=x; //errore! non posso "spostare" j su x
//y=5; //errore! non posso modificare x usando il riferimento y
j=q; // ha l'effetto di COPIARE il valore della variabile riferita da q nella
// locazione di memoria riferita da j!!!! non si pu modificare j perch divenga
// il riferimento ad un'altra variabile!!!!
cout << "x: " << x << " i: " << i << endl;
cout << "q: " << q << " j: " << j << endl;

Riferimenti e scambio di parametri




E possibile scambiare in parametri per


riferimento

Un parametro riferimento dunque un alias


della variabile argomento

La funzione chiamata far riferimento al


parametro effettivo specificato dal chiamante che
potr leggere e modificare direttamente
Il passaggio per riferimento efficiente in quanto
evita la copia del valore

Esempio




Il parametro formale in realt contiene lindirizzo del


parametro effettivo
Il passaggio dellindirizzo (dereferencing del riferimento)
a cura del compilatore
Nellesempio leffetto della chiamata sul riferimento v il
seguente:
int & v = a
void incr(int &v) {
v += 1;
}

int a = 4;
incr(a);
// ora a vale 5

Errore comune
Dato che i riferimenti sono menzionati solo con il nome nel
corpo della funzione chiamata potreste trattare
inavvertitamente un riferimento come parametro passato
per valore!!!!

Restituzione di riferimenti



Le funzioni possono restituire riferimenti


Restituire un riferimento ad una variabile
automatica definita allinterno della funzione un
errore perch essa non esister pi dopo la
terminazione della funzione!!!!! (dangling
reference)
Se si ritorna un riferimento ad una variabile
definita allinterno di una funzione, la variabile
deve essere stata dichiarata static (cio essere in
classe di memorizzazione statica)

Riferimenti


Deitel&Deitel, C++ Fondamenti di


programmazione,ed. Apogeo, 2005


Da C++ a UML


Cap. 6, da 6.13 a 6.17


Cap. 7, 6, 7, 8

B.Stroustrup, C++ principi di


programmazione


Cap. 7 7.7.1, cap. 12 12.1.5, 12.3

Potrebbero piacerti anche