学习Qt - 创建QApplication

Tim*_*ddy 4 c++ qt

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

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

MyObject o = new MyObject();
Run Code Online (Sandbox Code Playgroud)

但是在c ++中创建QApplication时,示例只显示:

QApplication app(argc, argv);
app.setOrganizationName("My Company");
app.setApplicationName("The App");
Run Code Online (Sandbox Code Playgroud)

突然之间,我有一个"应用程序"的引用,并没有明显的(对我来说)分配给应用程序...

这个模式是Q ++的东西还是特定的Qt?这种模式叫什么?

谢谢!

Mar*_*ett 6

不是Qt问题,但是,

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

在C++中,您可以选择在本地(在堆栈上)或使用new(在堆上)创建对象.当app对象具有明确的生命周期(main的长度)不会被删除和重新创建且只有一个存在时,在本地将其分配在这里更有意义.

C++的一个令人讨厌的特性(因为它的遗产)是访问结果对象的部分是不同的.如果直接创建,则使用"." app.name() 但如果分配了新的,你需要使用'c'指针表示法 app->name()

PS.有一些Qt特定的内存功能.Qt为你做了很多内存管理,例如.copy-on-write,自动删除.在Qt中,你很少需要为一个对象调用delete - 对于C++专家来说,这些有时很烦人,但是从Java看起来应该看起来更自然.

  • "与之相同"部分具有误导性,特别是对具有Java经验的人.正如你稍后提到的,不仅生命周期不同,而且在第二种情况下还需要删除指针 - 显然,在这种情况下Qt不会自动执行. (8认同)

Pal*_*mik 5

变量app是在QApplication app(argc, argv);它调用QApplication带有参数的构造函数的行上的堆栈上创建的,argcargv创建了在这种情况下QApplication调用的对象app.

这不是Qt特有的功能.您也可以使用构造函数以这种方式分配任何非虚拟类.此外,它适用于基元,因此您可以这样做:

int val(1); // Equivalent to: int val = 1;
Run Code Online (Sandbox Code Playgroud)

这将创建val以值1 命名的整数变量.

您可以在堆上使用QApplication对象进行分配,new并使用它,如下所示:

QApplication* app = new QApplication(argc, argv); // Heap allocation
app->setOrganizationName("My Company"); // Notice the -> instead of .
app->setApplicationName("The App");
Run Code Online (Sandbox Code Playgroud)

->基本上是取消引用指针和使用的快捷方式.

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