具有静态成员的类的构造函数何时在C ++中运行?

时间:2016-10-09 07:24:42

标签: c++

我是c ++的新手,所以我对此并不了解 所以基本上我有这个代码
头文件

class Application{
    public:
        static Application& getInstance()
        {
            return *mInstance;
        }
        Application();
        void run();
        protected:          
        static Application* mInstance;

源文件

Application* Application::mInstance;
Application::Application()
    {
        mInstance = this;           
    }

然后我做

 Application::getInstance().run();

Application类的构造函数何时运行? 它似乎在视觉工作室工作。 所以我的问题是为什么这有用呢? 为什么getInstance不返回空指针?因为我从来没有实例化过这个课程 这个代码标准吗?
这适用于任何现代的c ++编译器吗?

2 个答案:

答案 0 :(得分:0)

类的构造函数属于对象,即如果它被代码调用显式,它会在内存中创建一个对象(在堆栈上或在堆)。因此,如果你不在某个地方调用构造函数,它就永远不会被执行。

我只看到可以运行的一点是你没有指定mInstance指针的初始值。这意味着它的值是未定义的,并且意外地可以具有一些有效地址。如果run()方法未触及mInstance对象本身,则代码可以 有时有时不 。这是C ++中未初始化变量的问题。

但我建议遵循正确的单身人士模式: 1.将mInstance初始化为nullptr。 2.如果getInstance()mInstancenullptr函数应调用构造函数。

(只是一般性提示:避免将构造函数中的this传递给其他地方,因为此时对象未完全构造,并且在多线程应用的情况下,它可能会导致问题。)

答案 1 :(得分:0)

只要构造了一个对象,就会执行构造函数。

在调用main()之前构造文件范围的静态对象。但是,如果您依赖于构造两个这样的静态对象的顺序(例如,构造一个静态对象依赖于另一个已构建的静态对象),则可能存在问题。在两个不同的编译单元(也就是源文件)中定义的静态结构的顺序是未指定的。

本地(例如函数)的静态对象构造为控件传递其声明....通常是第一次调用它们的函数。