如果我们对静态成员变量使用默认参数,是否有任何陷阱?像这样:
enum Index
{
INDEX_A = 0,
INDEX_B
};
class foo
{
public:
static void method1( int a, int b = INDEX_A);
};
编译器永远不会抱怨,但是当它与静态有关时我总是很谨慎。
答案 0 :(得分:4)
从技术上讲,我会使用:
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
)。参数由调用时的编译器填充。
您对静态成员的评论适用于静态成员VARIABLES。编译和链接代码后立即存在成员函数。在实例化类时创建正常成员变量,例如,当代码执行foo x
或foo *p = new foo;
的代码时。静态成员变量具有“全局存储持续时间”,换句话说,它们就像全局变量,只是它们的“名称”在类中,而不是常规的全局变量。
是的,如果你在翻译单元之间使用它们(不同的源文件=不同的翻译单元),你必须担心静态成员变量的初始化顺序。初始化顺序未定义(通过标准)不同的TU之间。