Espressioni di argomenti predefinite
Le espressioni utilizzate per gli argomenti predefiniti sono spesso espressioni costanti, sebbene non sia un requisito. L'espressione può combinare le funzioni visibili nell'ambito corrente, le espressioni costanti e le variabili globali. L'espressione non può contenere variabili locali o variabili non statiche del membro della classe. Questa condizione è illustrata nel codice che segue:
BOOL CreateVScrollBar( HWND hWnd, short nWidth =
GetSystemMetrics( SM_CXVSCROLL ) );
La dichiarazione precedente specifica una funzione che crea una barra di scorrimento verticale di una larghezza specifica per una finestra. Se nessun argomento della larghezza viene fornito, la funzione API di Windows, GetSystemMetrics, viene chiamata per trovare la larghezza predefinita per una barra di scorrimento.
L'espressione predefinita viene valutata dopo la chiamata di funzione, ma la valutazione viene completata prima che la chiamata di funzione venga effettivamente effettuata.
Poiché gli argomenti formali di una funzione si trovano nell'ambito della funzione e poiché la valutazione degli argomenti predefiniti avviene prima della voce in questo ambito, non è possibile utilizzare gli argomenti formali o le variabili locali nelle espressioni predefinite dell'argomento.
Si noti che qualsiasi argomento formale dichiarato prima di un'espressione predefinita dell'argomento può nascondere un nome globale nell'ambito della funzione, che può causare errori. Il codice seguente non è consentito:
const int Categories = 9;
void EnumCategories( char *Categories[], int n = Categories );
Nel codice precedente, il nome globale Categories è invisibile all'ambito della funzione, pertanto l'espressione predefinita dell'argomento non è valida.