可以从静态函数调用构造函数吗?

时间:2011-05-02 08:32:22

标签: c++ static constructor

我很抱歉,如果之前已经问过这个问题(我试图找到它但是徒劳无功)。 我在http://sourcemaking.com/design_patterns/singleton/cpp/1处经历了Singleton设计模式(代码是从那里复制的)

class GlobalClass
{
    int m_value;
    static GlobalClass *s_instance;
    GlobalClass(int v = 0)
    {
        m_value = v;
    }
  public:
    int get_value()
    {
        return m_value;
    }
    void set_value(int v)
    {
        m_value = v;
    }
    static GlobalClass *instance()
    {
        if (!s_instance)
          s_instance = new GlobalClass;
        return s_instance;
    }
};

// Allocating and initializing GlobalClass's
// static data member.  The pointer is being
// allocated - not the object inself.
GlobalClass *GlobalClass::s_instance = 0;

void foo(void)
{
  GlobalClass::instance()->set_value(1);
  cout << "foo: global_ptr is " << GlobalClass::instance()->get_value() << '\n';
}

void bar(void)
{
  GlobalClass::instance()->set_value(2);
  cout << "bar: global_ptr is " << GlobalClass::instance()->get_value() << '\n';
}

int main()
{
  cout << "main: global_ptr is " << GlobalClass::instance()->get_value() << '\n';
  foo();
  bar();
}

我的问题在于             if(!s_instance)               s_instance = new GlobalClass;

s_instance = new GlobalClass将调用构造函数,但构造函数是非静态的,我们从静态函数调用它。这是如何运作的?构造函数在这方面“特殊”吗?

谢谢!

4 个答案:

答案 0 :(得分:4)

您可以从任何地方调用构造函数。如果你不能在没有实例的情况下调用构造函数,那么首先如何获得任何实例?

你可能无数次从普通函数中调用它们。静态功能也不例外。

答案 1 :(得分:1)

可以从静态函数调用构造函数。每当创建新对象时,编译器都会自动调用构造函数。它有助于正确初始化类成员。是的在某种程度上,您可以将Constructor视为可以从静态函数调用的特殊函数。

在上面的代码中,您正在实现一个名为Singleton的设计模式。

答案 2 :(得分:0)

第1点:在C ++中,您无法在静态成员函数中调用非静态成员函数。原因是静态函数中有 no“this”指针构造函数也不例外

class A
{
public:
    void fun(){};
    static void static_fun()
    {
        // This is illegal because fun() is non-static
        fun();
    }
};

第2点:你总是可以调用不同对象的方法,即使它是非静态的

class A
{
public:
    void fun(){};
    static void static_fun(A& a)
    {
        // Legal here because it's a (different) object..
        a.fun();
    }
};

<强>结论

它与代码中的构造函数无关。因为您正在创建另一个对象。您可以调用其所有公共方法,包括其构造函数。

答案 3 :(得分:0)

是,

  • 琐事:使用new ClassName - &gt;它将调用构造函数(在新实例上......)
  • 非平凡:placement new(仅适用于非常明确的库实现类型,方案)