首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >学习Qt -创建QApplication

学习Qt -创建QApplication
EN

Stack Overflow用户
提问于 2011-02-05 00:24:04
回答 2查看 2.9K关注 0票数 4

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

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

代码语言:javascript
运行
复制
MyObject o = new MyObject();

但在c++中创建QApplication时,示例简单地显示了:

代码语言:javascript
运行
复制
QApplication app(argc, argv);
app.setOrganizationName("My Company");
app.setApplicationName("The App");

所以突然间,我有了一个"app“的引用,而没有明显的(对我来说)对app的赋值...

这个模式是c++特有的,还是Qt特有的?这个模式叫什么?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-05 00:27:33

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

代码语言:javascript
运行
复制
//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++有一个恼人的特性(因为它继承了c语言),那就是访问结果对象的各个部分是不同的。如果直接创建,则使用".“app.name(),但如果使用new分配,则需要使用”c“指针表示法app->name()

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

票数 7
EN

Stack Overflow用户

发布于 2011-02-05 00:31:46

变量app是在堆栈的QApplication app(argc, argv);行上创建的,它使用参数argcargv调用QApplication的构造函数,在本例中创建了名为appQApplication对象。

这不是Qt特有的特性。你也可以通过这种方式使用构造函数分配任何非虚拟类。此外,它适用于原语,因此您可以执行以下操作:

代码语言:javascript
运行
复制
int val(1); // Equivalent to: int val = 1;

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

您可以使用new在堆上分配QApplication对象,并按如下方式使用它:

代码语言:javascript
运行
复制
QApplication* app = new QApplication(argc, argv); // Heap allocation
app->setOrganizationName("My Company"); // Notice the -> instead of .
app->setApplicationName("The App");

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4900318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档