Výchozí výrazy argumentu
Výrazy použité pro výchozí argumenty jsou často konstantními výrazy, ale není to vyžadováno.Výraz může kombinovat funkce viditelné v aktuálním oboru, konstantní výrazy a globální proměnné.Výraz nemůže obsahovat místní proměnné nebo nestatické proměnné, které jsou členy třídy.Následující kód toto znázorňuje:
BOOL CreateVScrollBar( HWND hWnd, short nWidth =
GetSystemMetrics( SM_CXVSCROLL ) );
Předchozí deklarace určuje funkci, která vytvoří pro okno posuvník dané šířky.Není-li poskytnut žádný argument šířky, je zavolána funkce rozhraní Windows API GetSystemMetrics a zjištěna výchozí velikost posuvníku.
Výchozí výraz je vyhodnocen po volání funkce, ale vyhodnocování je dokončeno dříve, než k volání skutečně dojde.
Jelikož jsou formální argumenty funkce obsaženy v oboru funkce a k vyhodnocení výchozích argumentů dochází před vstupem do tohoto oboru, nelze ve výchozích výrazech argumentů používat formální argumenty nebo místní proměnné.
Povšimněte si, že jakýkoli formální argument deklarovaný před výchozím výrazem argument může skrýt globální název v oboru funkce, v důsledku čehož může dojít k chybám.Následující kód je chybný:
const int Categories = 9;
void EnumCategories( char *Categories[], int n = Categories );
V předchozím kódu je globální název Categories skryt v oboru funkce, v důsledku čehož není platný výchozí výraz argumentu.