我是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 ++编译器吗?
答案 0 :(得分:0)
类的构造函数属于对象,即如果它被代码调用显式,它会在内存中创建一个对象(在堆栈上或在堆)。因此,如果你不在某个地方调用构造函数,它就永远不会被执行。
我只看到可以运行的一点是你没有指定mInstance
指针的初始值。这意味着它的值是未定义的,并且意外地可以具有一些有效地址。如果run()
方法未触及mInstance
对象本身,则代码可以 有时但有时不 。这是C ++中未初始化变量的问题。
但我建议遵循正确的单身人士模式:
1.将mInstance
初始化为nullptr
。
2.如果getInstance()
为mInstance
,nullptr
函数应调用构造函数。
(只是一般性提示:避免将构造函数中的this
传递给其他地方,因为此时对象未完全构造,并且在多线程应用的情况下,它可能会导致问题。)
答案 1 :(得分:0)
只要构造了一个对象,就会执行构造函数。
在调用main()
之前构造文件范围的静态对象。但是,如果您依赖于构造两个这样的静态对象的顺序(例如,构造一个静态对象依赖于另一个已构建的静态对象),则可能存在问题。在两个不同的编译单元(也就是源文件)中定义的静态结构的顺序是未指定的。
本地(例如函数)的静态对象构造为控件传递其声明....通常是第一次调用它们的函数。