Argomenti predefiniti
In molti casi, le funzioni presentano argomenti in cui vengono utilizzati talmente raramente che un valore predefinito basterebbe.Per risolvere questa, la funzionalità dell'impostazione predefinita-argomento consente di specificare solo gli argomenti a una funzione che sono significativi in una chiamata specificata.Per illustrare questo concetto, si consideri l'esempio illustrato nell'argomento overload di funzione.
// Prototype three print functions.
int print( char *s ); // Print a string.
int print( double dvalue ); // Print a double.
int print( double dvalue, int prec ); // Print a double with a
// given precision.
In molte applicazioni, impostazione predefinita ragionevole può essere fornita per prec, eliminando la necessità di due funzioni:
// Prototype two print functions.
int print( char *s ); // Print a string.
int print( double dvalue, int prec=2 ); // Print a double with a
// given precision.
L'implementazione di print la funzione viene modificata leggermente in base al fatto che solo una tale funzione dispongono di tipo doppio:
// default_arguments.cpp
// compile with: /EHsc /c
// Print a double in specified precision.
// Positive numbers for precision indicate how many digits
// precision after the decimal point to show. Negative
// numbers for precision indicate where to round the number
// to the left of the decimal point.
#include <iostream>
#include <math.h>
using namespace std;
int print( double dvalue, int prec ) {
// Use table-lookup for rounding/truncation.
static const double rgPow10[] = {
10E-7, 10E-6, 10E-5, 10E-4, 10E-3, 10E-2, 10E-1, 10E0,
10E1, 10E2, 10E3, 10E4, 10E5, 10E6
};
const int iPowZero = 6;
// If precision out of range, just print the number.
if( prec >= -6 && prec <= 7 )
// Scale, truncate, then rescale.
dvalue = floor( dvalue / rgPow10[iPowZero - prec] ) *
rgPow10[iPowZero - prec];
cout << dvalue << endl;
return cout.good();
}
Per richiamare il nuovo print funzione, utilizzare codice analogo al seguente:
print( d ); // Precision of 2 supplied by default argument.
print( d, 0 ); // Override default argument to achieve other
// results.
Si noti questi punti quando si utilizza argomenti denominati:
Gli argomenti denominati sono utilizzati solo nelle chiamate di funzione in cui gli argomenti finali vengono omessi - devono essere gli ultimi argomenti.Di conseguenza, il codice seguente non è valido:
int print( double dvalue = 0.0, int prec );
Un argomento predefinito non può essere ridefinito nelle dichiarazioni successive anche se la ridefinizione è identica all'originale.Pertanto, il codice seguente genera un errore:
// Prototype for print function. int print( double dvalue, int prec = 2 ); ... // Definition for print function. int print( double dvalue, int prec = 2 ) { ... }
Il problema è dovuto al fatto che la dichiarazione della funzione nella definizione ridefinisce l'argomento predefinito per prec.
Gli argomenti denominati aggiuntivi possono essere aggiunti dalle dichiarazioni successive.
Gli argomenti denominati possono essere forniti per i puntatori a funzioni.Di seguito è riportato un esempio:
int (*pShowIntVal)( int i = 0 );