Concetti Chiave
- Le funzioni con argomenti variabili utilizzano ellissi per accettare un numero indefinito di parametri, come nei casi di scanf() e printf().
- Per gestire gli argomenti variabili in C, è necessario impiegare la variabile di tipo va_list e le macro va_start(), va_arg() e va_end().
- Il C++ permette di definire funzioni con valori di default, che semplificano l'uso della funzione quando alcuni parametri non vengono specificati.
- I parametri con valori di default devono seguire l'ordine dei parametri tradizionali e non possono essere dichiarati nel prototipo e nell'intestazione della funzione simultaneamente.
- È consigliabile dichiarare i valori di default nel prototipo per migliorare la leggibilità del codice e facilitare la comprensione delle funzioni.
Funzioni con argomenti variabili
Funzioni con la lista degli argomenti di lunghezza variabile
Esempi: scanf(), printf().
tipoR nomeF(t1 p1, t2 p2, …, tn pn, …);
Tre puntini di sospensione o ellisse
Si devono usare una variabile di tipo va_list per scandire la lista di lunghezza variabile e le macro di sistema: va_start(),
va_arg() e va_end().
Argomenti di una funzione con valori di default
Se esaminiamo un sistema operativo ci accorgiamo che per molti comandi è possibile non specificare il valore di alcuni parametri, poiché il sistema è predisposto per sopprimere a questa mancanza assegnando ai parametri stessi dei valori predefiniti, chiamati valori di default.
Es. MS-DOS: comando interno dir.
Il C++ consente di costruire funzioni con argomenti che possono essere inizializzati al momento della dichiarazione con valori di
default predefiniti.
tipoR nomeF(t1 p1, t2 p2, …, tn pn, tp+1 pn+1 = v1, … tn+m pn+m=vm);
L’elenco dei possibili argomenti con valori di default deve obbligatoriamente seguire quella dei parametri tradizionali.
E’ consigliabile, per motivi di leggibilità, porre sempre gli eventuali valori di default nella dichiarazione del prototipo. Essi non si possono infatti porre sia nel prototipo che nell’intestazione della funzione.
void visualizza(int a, int b=0, int c=0);
int main()
{
visualizza(1,2,3);
visualizza(1,2);
visualizza(1);
return 0;
}
void visualizza(int a, int b, int c)
{
cout
}
Sovrapposizione di funzioni
Funzioni sovrapposte
Nella stesura di un pgm, in generale, è buona norma assegnare a funzioni diverse nomi diversi, ma, quando alcune funzioni eseguono
sostanzialmente lo stesso compito anche operando con oggetti di tipo diverso, può risultare più chiaro utilizzare il medesimo nome
per tutte le funzioni.
In C, l’operatore / viene usato sia per interi che per numeri reali.
Sovrapposizione di nome (overloading).
E’ il compilatore che sceglie quale funzione richiamare in base al risultato del confronto tra i tipi degli argomenti attuali e quelli dei corrispondenti parametri formali.
Esempio:
char simmetrico (car car); //range: ‘A’..’Z’
unsigned short int simmetrico (unsigned short int num); //range: 0..65535
Funzioni modello in C++
Funzioni modello (template)
In molte occasioni capita di dover ricorrere ad una serie di funzioni in cui varia solo il tipo degli argomenti, ma non le operazioni che devono essere compiute su di essi.
Il C++ ci consente di costruire un unico modello di funzione in grado di adattarsi a parametri di tipo diverso.
//Esempio: funzione modello scambia
template
void scambia (tipo & a, tipo &b);
int main()
{ int num1, num2;
double num3, num4;
scambia(num1, num2);
…
scambia(num3, num4);
…
}
template
void scambia (tipo & a, tipo &b)
{ tipo c;
c = a;
a = b;
b = c;
}
Domande da interrogazione
- Qual è la funzione delle ellissi nelle funzioni con argomenti variabili?
- Come vengono gestiti i valori di default nei parametri delle funzioni in C++?
- Qual è un esempio pratico di utilizzo di valori di default in una funzione?
Le ellissi (tre puntini di sospensione) indicano che una funzione può accettare un numero variabile di argomenti, come nel caso di scanf() e printf(). Per gestire questi argomenti, si utilizza una variabile di tipo va_list insieme alle macro va_start(), va_arg() e va_end().
In C++, è possibile definire funzioni con parametri che hanno valori di default, i quali devono essere specificati nella dichiarazione della funzione. È importante che i parametri con valori di default seguano quelli tradizionali e non possano essere ripetuti nel prototipo e nell'intestazione della funzione.
Un esempio pratico è la funzione `void visualizza(int a, int b=0, int c=0);`, dove b e c hanno valori di default. Ciò consente di chiamare la funzione con variabili diverse, come `visualizza(1,2,3);`, `visualizza(1,2);` o `visualizza(1);`, senza dover specificare sempre tutti i parametri.