在构造函数

时间:2016-05-10 13:49:10

标签: c++ constructor static-methods

这对我来说有点奇怪。由于静态方法可以有一个类的实例,因此人们自然希望编译器不允许在构造函数中调用静态方法。但我已经用每个编译器测试了下面的代码,具有讽刺意味的是,它们都没有给我一个警告。虽然在执行时间内它们都会抛出异常。我在这里错过了什么吗?

#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;
}

Live example

3 个答案:

答案 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)

没有理由不在构造函数中调用静态(或实际上是非静态)成员函数(尽管不建议调用虚函数)。