【问题标题】:When does a constructor of a class with static members runs in C++?具有静态成员的类的构造函数何时在 C++ 中运行?
【发布时间】:2016-10-09 07:24:41
【问题描述】:

我是 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++ 编译器吗?

【问题讨论】:

  • 你在getInstance之前的任何地方都创建了对象吗?
  • 构造函数运行时,不是“类的构造函数”,而是该类的特定对象的构造函数。您到目前为止发布的代码示例不会创建该类的任何对象。所以,构造函数永远不会运行。
  • 更好地了解Scott Meyer's singleton
  • Why does getInstance does not return a null pointer? since i have never instantiated the class. 好吧,因为 UB。您的代码完全错误。
  • @deviantfan: 不,我在调用 getInstance 之前不创建任何对象

标签: c++


【解决方案1】:

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

我认为它可以运行的唯一原因是您没有指定mInstance 指针的初始值。这意味着它的值是未定义的,并且意外地可能有一些有效的地址。如果run() 方法没有触及mInstance 对象本身,您的代码有时可以运行,但有时不能运行。这就是C++中变量未初始化的问题。

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

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

【讨论】:

  • 感谢您的帮助
【解决方案2】:

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

在调用main() 之前构造文件范围内的静态对象。但是,如果您依赖于两个这样的静态对象的构造顺序(例如,一个的构造依赖于另一个已经在构造的对象),那么您可能会遇到问题。在两个不同的编译单元(又名源文件)中定义的静态构造的顺序是未指定的。

本地(例如函数)的静态对象是在控制通过其声明时构造的……通常是在第一次调用它们的函数时。

【讨论】:

    猜你喜欢
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多