我正在重新学习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特有的?这个模式叫什么?
谢谢!
发布于 2011-02-05 00:27:33
不是真正的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++有一个恼人的特性(因为它继承了c语言),那就是访问结果对象的各个部分是不同的。如果直接创建,则使用".“app.name(),但如果使用new分配,则需要使用”c“指针表示法app->name()
ps。有几个Qt specific memory features。Qt为你做了很多内存管理,例如。写入时复制,自动删除。在Qt中,你很少需要为一个对象调用delete --对于C++专家来说,这有时会很烦人,但在Java语言中,它应该看起来更自然。
发布于 2011-02-05 00:31:46
变量app是在堆栈的QApplication app(argc, argv);行上创建的,它使用参数argc和argv调用QApplication的构造函数,在本例中创建了名为app的QApplication对象。
这不是Qt特有的特性。你也可以通过这种方式使用构造函数分配任何非虚拟类。此外,它适用于原语,因此您可以执行以下操作:
int val(1); // Equivalent to: int val = 1;这将创建一个值为1的、名为val的整数变量。
您可以使用new在堆上分配QApplication对象,并按如下方式使用它:
QApplication* app = new QApplication(argc, argv); // Heap allocation
app->setOrganizationName("My Company"); // Notice the -> instead of .
app->setApplicationName("The App");->基本上是取消引用指针和使用.的快捷方式
在堆栈上分配通常是更好的(但并不总是可行的),因为这样你就不必关心对象的生命周期(使用一些智能指针或原始delete),堆栈分配通常也比在堆上分配更便宜。
https://stackoverflow.com/questions/4900318
复制相似问题