4

如果我们对静态成员变量使用默认参数,会有什么陷阱吗?像这样:

enum Index
{
    INDEX_A = 0,
    INDEX_B
};

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

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

4

1 回答 1

5

从技术上讲,我会使用:

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

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

还要注意,当使用默认参数时,如果你稍后定义你的函数,你可以获得非常有趣的东西,使用这个:

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

因为,根据您调用函数的位置,您可能具有orb的值(如果您在定义之前调用它,或者在不同的翻译单元中调用它,它将是,如果您在定义之后调用它,它可能是) . 该参数由编译器在调用时填充。INDEX_AINDEX_BINDEX_AINDEX_B

您对静态成员的评论适用于静态成员 VARIABLES。一旦代码被编译和链接,成员函数就存在。普通成员变量在类被实例化时创建,例如,当代码执行foo xor的代码时foo *p = new foo;。静态成员变量具有“全局存储期限”,换句话说,它们就像全局变量,只是它们的“名称”在类内部,而不是常规的全局变量。

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

于 2014-05-30T08:25:01.570 回答