如果我们对静态成员变量使用默认参数,是否有任何陷阱?像这样:
enum Index
{
INDEX_A = 0,
INDEX_B
};
class foo
{
public:
static void method1( int a, int b = INDEX_A);
};
编译器从不提示,但当涉及到静态时,我总是很谨慎。
最佳答案
从技术上讲,我会使用:
static void method1( int a, Index b = INDEX_A);
但除此之外,静态函数与任何其他函数没有区别。他们只是没有传入“隐藏的”
this
参数,因此不会使用类的实例调用该函数。还要注意,当使用默认参数时,如果你以后定义你的函数,你会得到非常有趣的东西,使用这个:
static void method1( int a, Index b = INDEX_B)
{
...
}
因为,根据您调用函数的位置,您可能拥有值为
b
或 INDEX_A
的 INDEX_B
(如果您在定义之前调用它,或者在不同的翻译单元中调用它,它将是 INDEX_A
,如果您在定义之后调用它,它可能是 INDEX_B
)。该参数由编译器在调用时填充。您对静态成员的评论适用于静态成员变量。一旦代码被编译和链接,成员函数就存在。普通成员变量在类被实例化时创建,例如当代码执行
foo x
或 foo *p = new foo;
的代码时)。静态成员变量具有“全局存储期”,换句话说,它们类似于全局变量,只是它们的“名称”在类内部,而不是常规的全局变量。是的,如果您在翻译单元(不同的源文件 = 不同的翻译单元)之间使用静态成员变量,您必须担心初始化顺序。不同 TU 之间的初始化顺序是未定义的(根据标准)。
关于c++具有默认参数的静态成员方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23949846/