这对我来说有点奇怪。由于静态方法可以有一个类的实例,因此人们自然希望编译器不允许在构造函数中调用静态方法。但我已经用每个编译器测试了下面的代码,具有讽刺意味的是,它们都没有给我一个警告。虽然在执行时间内它们都会抛出异常。我在这里错过了什么吗?
#include <iostream>
class Foo
{
public:
inline Foo()
{
std::cout << "testing: var = " << bar() - 1 << '\n';
}
~Foo(){}
static int bar()
{
Foo f;
f.var = 10;
return f.test();
}
private:
int var;
int test()
{
return var + 1;
}
};
int main()
{
Foo foo;
return 0;
}
答案 0 :(得分:5)
从构造函数中调用静态函数并不违法。只是,如果你这样做,你会得到一个堆栈溢出。这导致
Foo()调用bar(); bar()调用Foo(); Foo()调用bar(); bar()调用Foo(); ...
直到没有堆叠。
这与您的情况完全相同:
void f1();
void f2()
{
f1();
}
void f1()
{
f2();
}
int main(int, char*[])
{
f1();
return 0;
}
只有两个全局函数,仅此而已。也可以在C中完全相同(但你已经在那里声明void f(void)
),或Java,C#,perl,python,......
答案 1 :(得分:2)
您期待什么警告?你写的是无限递归,它与静态成员函数无关。您可以使用类内部或外部的任何其他函数执行此操作。
静态函数与免费函数没有太大区别。那么自由函数也应该被禁止构造函数?禁止从构造函数调用静态函数是没有意义的。
答案 2 :(得分:1)
没有理由不在构造函数中调用静态(或实际上是非静态)成员函数(尽管不建议调用虚函数)。