理解主功能中的静态对象

Understaning of static objects in main function

本文关键字:静态 对象 功能      更新时间:2023-10-16

我正在尝试构建应用程序,如果它是gui应用程序还是控制台,将根据控制台参数进行选择。

int main(int argc, char *argv[])
 {
    QApplication app(argc, argv);
    QCommandLineParser parser;
    parser.setApplicationDescription("Test");
    parser.addHelpOption();
    parser.addVersionOption();
    QCommandLineOption guiOption(QStringList() << "g" << "gui", "Gui");
    parser.addOption(guiOption);
    parser.process(app);
    bool isGUI = parser.isSet(guiOption);
    APPstub stub(0,isGUI);

if (isGUI) {                //GUI APP
    static APP_Window ui(&stub);   ////*****THIS
    ui.show();
}
else {                      // CONSOLE APP
    static APP_Console con(&stub);  ////*****THIS
    con.showMenu(); 
    }
    return app.exec();
}

我发现我需要在条件下创建这些对象(////*****THIS(需要是静态的,但我不明白为什么?问题是:例如,当我在条件之外使用APP_Window ui(&stub(时,它就工作了,并显示了gui。如果我把它放在这种情况下,Window会弹出并迅速消失。

我对此感到困惑。。。你能帮我理解那个问题吗?谢谢:(

如果未声明为静态,则APP_Window对象是声明它的{}块的本地对象。一旦在块之外,对象就会被解除分配。任何本地对象都被分配到堆栈上,一旦我们到达块的末尾,编译器就会自动释放该堆栈。

在{}块(或函数(中声明为静态的对象实际上是具有局部可见性的全局对象。因此,它是持久的,直到应用程序退出。

例如,这些局部变量仅在定义它们的块中可见且有效:

{
    int i = 3;
    ...
}

void f() {
    int x = 5232;
}

现在这些变量是全局的,尽管它们只有一个局部作用域(在声明它们的块中(:

{
    static int i = 3;
    ...
}

void f() {
    static int x = 5232;
}

因为当你的代码离开大括号时:"con"answers"ui"对象将被销毁,因为如果它们不是静态的,它们的范围会受到大括号的限制。

使它们成为static将延长所创建对象的生存期,直到程序结束。

如果没有static,则生存期将在定义变量的作用域的末尾结束。

如果对象不是static,它们将在其包含块的末尾(在关闭的}处(停止存在,并且它们的析构函数将被调用。

假定对象是以某种方式注册的,因此它们在app.exec()的调用中使用。然后,它们的析构函数将注销它们,因此不能使用。