Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 可以从静态函数调用构造函数吗?_C++_Static_Constructor - Fatal编程技术网

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

C++ 可以从静态函数调用构造函数吗?,c++,static,constructor,C++,Static,Constructor,如果以前有人问过这个问题,我很抱歉(我试图找到它,但徒劳无功)。 我在(代码是从那个里复制的)经历了单例设计模式 class全局类 { int m_值; 静态GlobalClass*s_实例; 全局类(int v=0) { m_值=v; } 公众: int get_值() { 返回m_值; } 无效集_值(int v) { m_值=v; } 静态GlobalClass*实例() { 如果(!s_实例) s_实例=新的全局类; 返回s_实例; } }; //分配和初始化全局类的 //静态数据成员。

如果以前有人问过这个问题,我很抱歉(我试图找到它,但徒劳无功)。 我在(代码是从那个里复制的)经历了单例设计模式

class全局类
{
int m_值;
静态GlobalClass*s_实例;
全局类(int v=0)
{
m_值=v;
}
公众:
int get_值()
{
返回m_值;
}
无效集_值(int v)
{
m_值=v;
}
静态GlobalClass*实例()
{
如果(!s_实例)
s_实例=新的全局类;
返回s_实例;
}
};
//分配和初始化全局类的
//静态数据成员。指针正在运行
//已分配-不是对象本身。
GlobalClass*GlobalClass::s_实例=0;
无效foo(无效)
{
GlobalClass::instance()->set_值(1);

Cuth

是一个静态函数调用构造函数。每当创建一个新的对象时,编译器会自动调用构造函数。它有助于初始化类成员。是的,在某种程度上,你可以把构造函数看作是一个特殊函数,它可以从静态函数调用。


在上面的代码中,您正在实现一个名为“Singleton”的设计模式。您可以从任何地方调用构造函数。如果没有实例就无法调用构造函数,那么首先您将如何获得任何实例


你可能已经多次调用了普通函数。静态函数没有什么不同。

< P> <强> 1:在C++中,不能在静态成员函数< /强>中调用非静态成员函数。原因是“强”>“不”。静态函数中的指针。构造函数也不例外

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();
    }
};
结论

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

  • 简单地说:使用
    newclassname
    -->它将调用构造函数(在新实例上…)
  • 非常重要:(仅对非常明确的库实现类型、场景有用)

唯一不能做的事情就是从同一类的静态方法内部调用类方法。这很明显,因为方法需要调用对象,而静态方法则不需要。请注意,现在人们非常反对单例。请注意了解原因。摘要:单例是全局的,全局引入隐式依赖冗余和隐式依赖关系是测试、调试和维护的噩梦。请记住,每个程序都是在主函数中启动的,而主函数是一个静态函数。因此,是的,您可以阅读以下内容:如果您要使用Singleton(您可能不应该这样做)那么请不要像那样实现它。指针是可怕的,如果你不需要的话,就不应该使用它(在这里你也不需要)(如果事实指针使Singleton更难正确执行)。问自己这个问题:singelton将如何/何时被销毁?OP肯定非常清楚这一点,因此他/她对构造函数的问题非常了解。仔细阅读问题。@Als,请再次阅读我的答案。我认为OP可能会与之混淆。啊,抱歉。我已经在您编辑的答案之前添加了评论。谢谢您的快速回复。我想阅读更多关于它的信息。我在哪里可以找到更多信息?例如,它是否在标准中定义(如果是,在哪里)。你有一些方便的链接供我深入研究吗?一些可靠的来源就可以了:)再次感谢。@阿努:它不是C++标准。你只是在静态函数中创建一个新对象,这与从主(或)静态函数创建对象没有什么不同。为了简单起见,我这么说。只要记住创建一个对象就调用一个构造函数。(无论在何处创建对象)
class A
{
public:
    void fun(){};
    static void static_fun(A& a)
    {
        // Legal here because it's a (different) object..
        a.fun();
    }
};