带有默认参数的c ++静态成员方法

时间:2014-05-30 08:06:31

标签: c++ static default-arguments

如果我们对静态成员变量使用默认参数,是否有任何陷阱?像这样:

enum Index
{
    INDEX_A = 0,
    INDEX_B
};

class foo
{
public:
    static void method1( int a, int b = INDEX_A);
};

编译器永远不会抱怨,但是当它与静态有关时我总是很谨慎。

1 个答案:

答案 0 :(得分:4)

从技术上讲,我会使用:

static void method1( int a, Index b = INDEX_A);

但除此之外,静态函数与任何其他函数没有区别。它们只是没有传入“隐藏”this参数,因此不会使用类的实例调用该函数。

另请注意,使用默认参数时,如果稍后定义函数,则可以获得非常有趣的内容:

static void method1( int a, Index b = INDEX_B)
{
  ...
}

因为,根据您调用该函数的位置,您可能b的值为INDEX_AINDEX_B(如果您在定义之前调用它,或者使用不同的翻译)单位,它将是INDEX_A,如果你在定义后调用它,它可能是INDEX_B)。参数由调用时的编译器填充。

您对静态成员的评论适用于静态成员VARIABLES。编译和链接代码后立即存在成员函数。在实例化类时创建正常成员变量,例如,当代码执行foo xfoo *p = new foo;的代码时。静态成员变量具有“全局存储持续时间”,换句话说,它们就像全局变量,只是它们的“名称”在类中,而不是常规的全局变量。

是的,如果你在翻译单元之间使用它们(不同的源文件=不同的翻译单元),你必须担心静态成员变量的初始化顺序。初始化顺序未定义(通过标准)不同的TU之间。