学习Qt - 创建QApplication

时间:2011-02-04 16:24:04

标签: c++ qt

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

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

MyObject o = new MyObject();

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

QApplication app(argc, argv);
app.setOrganizationName("My Company");
app.setApplicationName("The App");

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

这种模式是Q ++还是特定于Qt?这种模式叫什么?

谢谢!

2 个答案:

答案 0 :(得分:6)

不是真正的Qt问题,但是,

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

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

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

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

答案 1 :(得分:5)

变量app在行QApplication app(argc, argv);的堆栈上创建,它调用QApplication的构造函数,其参数argcargv创建QApplication 1}}在这种情况下称为app的对象。

这不是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");

->基本上是取消引用指针并使用.

的快捷方式

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