2011-02-04 42 views
4

我再学习C++(我有十年的Java经验),我也是在学习过程中的Qt ...学习的Qt - 创建QApplication的

我已经习惯了创建对象(在JAVA)通过:

MyObject o = new MyObject(); 

但是,创造C++中的QApplication的时候,这些例子只是显示:

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

那么突然,我有一个参考,以 “应用程序”,并没有明显的(对我来说)分配应用程序...

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

谢谢!

+4

我建议不要同时学习UI和C++语言。我特别推荐在使用/学习Qt时不要试图学习C++语言。Qt扩展了语言,使用Qt时你可以做的很多事情对于C++来说并不是很容易/可能,甚至是不可取的。 – 2011-02-04 17:27:21

回答

6

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

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

在C++中你有本地创建(上叠)或新的(上堆)中的选择对象。当应用程序对象具有确定的生命周期(主要长度)不会被删除并重新创建,并且只有一个存在时,在本地分配它会更有意义。

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

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

+8

“就像是一样”,部分是误导性的,特别是对于有Java经验的人。不仅如此,后面你会提到,但是在第二种情况下,还需要删除指针 - 显然,在这种情况下,Qt不会自动执行。 – 2011-02-04 17:36:33

5

可变app在堆栈上创建在其上创建QApplication对象在这种情况下称为app线QApplication app(argc, argv);它调用QApplication的构造与参数argcargv

这不是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),堆栈分配也比分配上通常更便宜堆。