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

C++ c++;带有默认参数的静态成员方法,c++,static,default-arguments,C++,Static,Default Arguments,如果我们对静态成员变量使用默认参数,是否存在任何缺陷?像这样: 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); 但除此之外,静态函数与

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

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);
但除此之外,静态函数与任何其他函数都没有区别。它们只是没有传入“hidden”
这个
参数,因此不会使用类的实例调用函数

另外请注意,当使用默认参数时,如果以后使用以下方法定义函数,您可以得到非常有趣的东西:

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

因为,根据调用函数的位置,可能会有值为
INDEX\u a
INDEX\u b
b
(如果在定义之前调用它,或在不同的翻译单元中调用它,它将是
INDEX\u a
,如果在定义之后调用它,它可能是
INDEX\u b
)。参数由编译器在调用时填写

关于静态成员的注释适用于静态成员变量。一旦编译并链接代码,成员函数就存在。普通成员变量是在实例化类时创建的,例如,当代码执行
foo x
foo*p=new foo的代码时)。静态成员变量具有“全局存储持续时间”,换句话说,它们类似于全局变量,只是它们的“名称”在类中,而不是常规的全局变量


是的,如果在转换单元之间使用静态成员变量(不同的源文件=不同的转换单元),则必须考虑初始化顺序。不同TU之间的初始化顺序(根据标准)未定义

b
不是
int
,你在说什么样的陷阱?如果你只是在学习,你的消息来源有没有告诉你关于陷阱的任何事情?静态方法是完全正常的。避免静态数据。非常感谢您的回复。我正在学习C++中的“静态”。我担心初始化的顺序。我了解到静态成员是在程序启动时定义的。我了解到,调用该方法时,默认参数是“evaluated”。这是否意味着默认参数必须是某种“const”,并在静态方法之前声明和定义?我的问题有意义吗?在您给我们的示例中没有静态成员。只有一个静态成员函数。没有静态数据成员。感谢您的解释。“参数由编译器在调用时填写。”这是我不清楚的。那么默认参数的值是在编译时计算的,而不是在运行时?这是否意味着默认值必须是“const”,可以在编译时确定?是的,默认参数必须是编译器可以在编译时确定的参数。根据语言定义,不严格地
const
,例如,允许使用全局变量,但不允许
const