在构造函数中调用静态方法
Calling static methods in constructor
这对我来说似乎有点奇怪。由于静态方法可以有一个 class 的实例,因此人们自然希望编译器不允许在构造函数内部调用静态方法。但我已经用每个编译器测试了以下代码,具有讽刺意味的是,其中 none 给了我一个警告。虽然在执行时它们都抛出异常。我在这里遗漏了什么吗?
#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;
}
没有理由不在构造函数中调用静态(或实际上是非静态)成员函数(尽管不建议调用虚函数)。
在构造函数中调用静态函数并不违法。只有,如果你像你那样做,你会得到一个堆栈溢出。这导致
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、...
您期待什么警告?你写的是一个无限递归,与静态成员函数无关。您可以使用 class 内部或外部的任何其他函数来完成此操作。
静态函数与免费函数没有太大区别。那么自由函数也应该被构造函数禁止吗?禁止从构造函数调用静态函数是没有意义的。
这对我来说似乎有点奇怪。由于静态方法可以有一个 class 的实例,因此人们自然希望编译器不允许在构造函数内部调用静态方法。但我已经用每个编译器测试了以下代码,具有讽刺意味的是,其中 none 给了我一个警告。虽然在执行时它们都抛出异常。我在这里遗漏了什么吗?
#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;
}
没有理由不在构造函数中调用静态(或实际上是非静态)成员函数(尽管不建议调用虚函数)。
在构造函数中调用静态函数并不违法。只有,如果你像你那样做,你会得到一个堆栈溢出。这导致
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、...
您期待什么警告?你写的是一个无限递归,与静态成员函数无关。您可以使用 class 内部或外部的任何其他函数来完成此操作。
静态函数与免费函数没有太大区别。那么自由函数也应该被构造函数禁止吗?禁止从构造函数调用静态函数是没有意义的。