Wyrażenia argumentu domyślnego
Wyrażenia używane dla argumentów domyślnych są często stałymi wyrażeniami, ale nie jest to wymagane.Wyrażenie mogą łączyć funkcje, które są widoczne w bieżącym zakresie, stałe wyrażenia i zmienne globalne.Wyrażenie nie może zawierać zmiennych lokalnych lub zmiennych, które należą do klasy i nie są statyczne.Ilustruje to poniższy kod:
BOOL CreateVScrollBar( HWND hWnd, short nWidth =
GetSystemMetrics( SM_CXVSCROLL ) );
Poprzedzająca deklaracja określa funkcję, która tworzy pionowy pasek przewijania określonej szerokości.Jeśli żaden argument szerokości nie zostanie podany, zostanie wywołana funkcja GetSystemMetrics z Windows API w celu wyszukania domyślnej szerokości paska przewijania.
Domyślne wyrażenie jest obliczane po wywołaniu funkcji, ale obliczenia kończą się zanim wywołanie funkcji będzie faktycznie miało miejsce.
Ponieważ formalne argumenty funkcji są w zakresie funkcji, a ocena domyślnych argumentów ma miejsce przed wejściem do tego zakresu, argumentów formalnych lub lokalnych zmiennych nie można używać w wyrażeniach argumentów domyślnych.
Należy pamiętać, że każdy argument formalny deklarowany przed wyrażeniem argumentów domyślnych może ukryć nazwę globalną w zakresie funkcji, co może powodować błędy.Poniższy kod jest niedozwolony:
const int Categories = 9;
void EnumCategories( char *Categories[], int n = Categories );
W poprzednim kodzie globalna nazwa Categories jest ukryta w zakresie funkcji, co czyni wyrażenie argumentów domyślnych nieprawidłowym.