我正在重新学习c ++(我有10年的Java经验),我也在学习Qt ...
我习惯于通过以下方式创建对象(在Java中):
MyObject o = new MyObject();
Run Code Online (Sandbox Code Playgroud)
但是在c ++中创建QApplication时,示例只显示:
QApplication app(argc, argv);
app.setOrganizationName("My Company");
app.setApplicationName("The App");
Run Code Online (Sandbox Code Playgroud)
突然之间,我有一个"应用程序"的引用,并没有明显的(对我来说)分配给应用程序...
这个模式是Q ++的东西还是特定的Qt?这种模式叫什么?
谢谢!
不是Qt问题,但是,
//You have an assignment to app
QApplication app(argc, argv);
// is just the same as
QApplication *app = new QApplication(argc, argv);
Run Code Online (Sandbox Code Playgroud)
在C++中,您可以选择在本地(在堆栈上)或使用new(在堆上)创建对象.当app对象具有明确的生命周期(main的长度)不会被删除和重新创建且只有一个存在时,在本地将其分配在这里更有意义.
C++的一个令人讨厌的特性(因为它的遗产)是访问结果对象的部分是不同的.如果直接创建,则使用"." app.name() 但如果分配了新的,你需要使用'c'指针表示法 app->name()
PS.有一些Qt特定的内存功能.Qt为你做了很多内存管理,例如.copy-on-write,自动删除.在Qt中,你很少需要为一个对象调用delete - 对于C++专家来说,这些有时很烦人,但是从Java看起来应该看起来更自然.
变量app是在QApplication app(argc, argv);它调用QApplication带有参数的构造函数的行上的堆栈上创建的,argc并argv创建了在这种情况下QApplication调用的对象app.
这不是Qt特有的功能.您也可以使用构造函数以这种方式分配任何非虚拟类.此外,它适用于基元,因此您可以这样做:
int val(1); // Equivalent to: int val = 1;
Run Code Online (Sandbox Code Playgroud)
这将创建val以值1 命名的整数变量.
您可以在堆上使用QApplication对象进行分配,new并使用它,如下所示:
QApplication* app = new QApplication(argc, argv); // Heap allocation
app->setOrganizationName("My Company"); // Notice the -> instead of .
app->setApplicationName("The App");
Run Code Online (Sandbox Code Playgroud)
这->基本上是取消引用指针和使用的快捷方式.
在堆栈上分配通常是可取的(但并不总是可行),因为那时你不必关心对象的生命周期(使用一些智能指针或原始delete),堆栈分配通常也比在堆上分配要便宜.