学习Qt - 创建QApplication

4

我正在重新学习c++(我有10年的Java经验),在此过程中我也在学习Qt...

我习惯于通过以下方式创建对象(在Java中):

MyObject o = new MyObject();

但是在使用C++创建QApplication时,示例通常会简单地显示如下内容:
QApplication app(argc, argv);
app.setOrganizationName("My Company");
app.setApplicationName("The App");

突然间,我看到了“app”的引用,但是没有明显的(对我来说)将其赋值给app的语句...

这种模式是C++的一种特性还是只有Qt有?这种模式叫什么名字?

谢谢!


4
我建议不要同时学习UI和C++语言。尤其是在使用/学习Qt时,不要试图学习C++语言。Qt扩展了这种语言,使用Qt时可以做很多事情,但这些对于C++来说可能并不容易实现或者并不需要。 - Edward Strange
2个回答

7

这并不是一个Qt相关的问题,但是

//You have an assignment to app  
QApplication app(argc, argv);
// is just the same as
QApplication *app = new QApplication(argc, argv);

在C++中,您可以选择在本地(堆栈)或使用new(堆)创建对象。在这里分配本地对象更有意义,当应用程序对象具有明确的生命周期(main函数的长度)不会被删除和重新创建且仅存在一个时。
C++的一个烦人的特性(因为它的C语言遗产),是访问结果对象的部分不同。如果直接创建,则使用 "." app.name(),但如果使用new进行分配,则需要使用'c'指针符号 app->name() 附注:Qt有一些 特定于Qt的内存功能。 Qt为您执行很多内存管理,例如写入时复制,自动删除。在Qt中,您很少需要为对象调用delete - 对于C ++专家来说,这有时很烦人,但对于Java来说,应该看起来更自然。

8
“is just the same as”这部分内容会给有Java经验的人带来误导。正如你后面提到的那样,不仅生命周期不同,在第二种情况下还需要删除指针——显然Qt在这种情况下不会自动执行。 - Sergei Tachenov

5
变量app在第QApplication app(argc, argv);行上被创建在堆栈中,它调用了QApplication的构造函数,参数为argcargv,这将在本例中创建了一个名为appQApplication对象。
这不是Qt特有的功能。您也可以用这种方式分配任何非虚拟类的构造函数。此外,它适用于基元类型,例如:
int val(1); // Equivalent to: int val = 1;

这将创建一个名为val,值为1的整数变量。

您可以使用new在堆上分配QApplication对象,并像下面这样使用它:

QApplication* app = new QApplication(argc, argv); // Heap allocation
app->setOrganizationName("My Company"); // Notice the -> instead of .
app->setApplicationName("The App");
< p > -> 基本上是一个指针解引用和使用.的快捷方式。

在堆栈上分配通常是首选(但并非总是可行),因为您不必关心对象的生命周期(使用一些智能指针或原始delete),堆栈分配通常也比堆上分配要便宜。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接