我正在重新学习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?这种模式叫什么?
谢谢!
答案 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
的构造函数,其参数argc
和argv
创建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
),堆栈分配通常也会少一些比在堆上分配贵。