我很抱歉,如果之前已经问过这个问题(我试图找到它但是徒劳无功)。 我在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将调用构造函数,但构造函数是非静态的,我们从静态函数调用它。这是如何运作的?构造函数在这方面“特殊”吗?
谢谢!
答案 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;它将调用构造函数(在新实例上......)