Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.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++ 为什么可以';我们在Qt中创建对象时不使用new关键字(即在堆栈上)?_C++_Qt - Fatal编程技术网

C++ 为什么可以';我们在Qt中创建对象时不使用new关键字(即在堆栈上)?

C++ 为什么可以';我们在Qt中创建对象时不使用new关键字(即在堆栈上)?,c++,qt,C++,Qt,为什么我们不能在没有new关键字的情况下在QT中创建对象?通常我们创建指向对象的指针,如下所示: QLabel *ql=new QLabel(); ql->show() 但我想创建这样一个对象: QLabel ql=QLabel(); ql.show() 有可能吗?改变 QLabel ql=QLabel(); 到 和阅读一些C++书籍。 可以从堆栈创建QT对象(没有新的),但是这些对象在超出范围时会自动删除。例如: void doSomething() { QLa

为什么我们不能在没有
new
关键字的情况下在QT中创建对象?通常我们创建指向对象的指针,如下所示:

QLabel *ql=new QLabel();    ql->show()
但我想创建这样一个对象:

QLabel ql=QLabel();    ql.show()
有可能吗?

改变

QLabel ql=QLabel();


<>和阅读一些C++书籍。

可以从堆栈创建QT对象(没有新的),但是这些对象在超出范围时会自动删除。例如:

void doSomething()
{
    QLabel ql; 
    ql.show()
} // scope ends, ql is deleted
<> p>这就是C++的工作原理,它不是Qt特定的特性。
QLabel ql;
在堆栈上创建
QLabel

请注意,它将一直存在,直到当前作用域退出。

问题是Qt控件(标签、按钮)处于层次结构中(例如,按钮属于表单)。Qt的实现方式要求当一个对象被销毁时,所有属于它的对象也被销毁

如果将对象放置在堆栈上(这就是“创建而不使用
new
关键字”的真正调用方式),它们将自动销毁。这是C++的特性,它适用于所有程序。下面是如果在堆栈上分配标签的情况下的工作方式

{
    QLabel ql = QLabel(some_form); 
    ql.show()
} // scope ends, ql is deleted

delete some_form;
  // ql will be deleted here as well
  // but it's already dead!
  // Program crashes!
这样的堆栈分配意味着当您销毁标签所属的对象时,标签可能已经被销毁。这会使你的程序崩溃

实际上,有时可以在堆栈上创建对象。在
main
函数中,您可以在堆栈上分配“主控件”(通常是主窗口)。问题是,这个对象在程序执行期间不会被破坏,所以它可以安全地在堆栈上,直到主出口——即程序终止。以下是一段引自:

#包括
#包括
#包括
int main(int argc,char*argv[])
{
QApplication应用程序(argc、argv);
翻译;
加载(“hellotr_la”);
app.installTranslator(&translator);
QPushButton你好(QPushButton::tr(“你好,世界!”);
你好,调整大小(100,30);
你好,show();
返回app.exec();
}

Qt对此也有一个简短的解释:只有当代码在函数中时,才会在堆栈上创建它。作为一个全局变量,它将在堆上创建。
{
    QLabel ql = QLabel(some_form); 
    ql.show()
} // scope ends, ql is deleted

delete some_form;
  // ql will be deleted here as well
  // but it's already dead!
  // Program crashes!
 #include <QApplication>
 #include <QPushButton>
 #include <QTranslator>

 int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);

     QTranslator translator;
     translator.load("hellotr_la");
     app.installTranslator(&translator);

     QPushButton hello(QPushButton::tr("Hello world!"));
     hello.resize(100, 30);

     hello.show();
     return app.exec();
 }