預設引數運算式
預設引數所使用的運算式通常是常數運算式,但這不是必要的。 運算式可以合併在目前範圍、常數運算式和全域變數中可見的函式。 運算式不能包含區域變數或非靜態類別成員變數。 以下程式碼將說明這點:
BOOL CreateVScrollBar( HWND hWnd, short nWidth =
GetSystemMetrics( SM_CXVSCROLL ) );
上述宣告中指定的函式會建立視窗的指定寬度垂直捲軸。 如果未提供寬度引數,則會呼叫 Windows 應用程式開發介面函式 GetSystemMetrics 尋找捲軸的預設寬度。
預設運算式會在函式呼叫之後進行求值,不過求值會在函式呼叫實際發生之前完成。
由於函式的正式引數是在函式範圍內,而且預設引數的求值是在進入這個範圍之前發生,因此您無法在預設引數運算式中使用正式引數或區域變數。
請注意,在預設引數運算式之前宣告的任何正式引數,都可以隱藏函式範圍中的全域名稱,該名稱可能會產生錯誤。 以下是不合法的程式碼:
const int Categories = 9;
void EnumCategories( char *Categories[], int n = Categories );
在上述程式碼中,全域名稱 Categories 會在函式範圍中隱藏,而使得預設引數運算式無效。