默认参数的表达式
使用默认参数的表达式通常是常数表达式,但是,这不是必需的。 此表达式可合并所显示在当前范围、常数表达式和全局变量的功能。 该表达式不能包含局部变量或非静态类成员变量。 下面的代码阐释了这一点:
BOOL CreateVScrollBar( HWND hWnd, short nWidth =
GetSystemMetrics( SM_CXVSCROLL ) );
上面的声明中指定创建特定宽度垂直滚动条窗口的功能。 如果未提供宽度参数, windows API 函数, GetSystemMetrics,调用查找滚动条的默认宽度。
默认表达式进行计算,在函数调用之后,但是,计算完成,在函数调用确实发生之前。
由于对函数的形参在函数范围,,并且,由于默认参数的计算项之前发生了此范围,则在默认参数表达式不能使用形参或局部变量。
请注意声明的所有形参,在默认参数表达式可以在函数范围之前隐藏全局名称,会导致错误。 下面的代码是非法的:
const int Categories = 9;
void EnumCategories( char *Categories[], int n = Categories );
在上面的代码中,全局名称 Categories 隐藏在函数范围,使默认参数的表达式无效。