默认参数表达式

用于默认参数的表达式通常是常数表达式,但这不是必需的。 表达式可组合在当前范围、常数表达式和全局变量中可见的函数。 表达式不能包含局部变量或非静态类成员变量。 下面的代码阐释了这一点:

BOOL CreateVScrollBar( HWND hWnd, short nWidth =
GetSystemMetrics( SM_CXVSCROLL ) );

前面的声明指定一个创建窗口的给定宽度的垂直滚动条的函数。 如果未提供宽度参数,则调用 Windows API 函数 GetSystemMetrics 以查找滚动条的默认宽度。

默认表达式在函数调用之后计算,但该计算将在函数调用实际发生前完成。

由于函数的形参在函数范围内,并且默认参数的计算在此范围中的条目之前进行,因此不能在默认参数表达式中使用形参或局部变量。

请注意,在默认参数表达式之前声明的任何形参可以隐藏函数范围内的全局名称,这会导致错误。 下列代码是非法的:

const int Categories = 9;
void EnumCategories( char *Categories[], int n = Categories );

在前面的代码中,全局名称 Categories 隐藏在函数范围中,这会使默认参数表达式无效。

请参见

参考

默认参数