打电话是否有效,qApp->exec()
或者QCoreApplication::exec()
我正在使用QApplication
实例?由于它是一个静态函数,因此在这两种情况下QCoreApplication::exec()
都会被调用。但是,似乎即使我调用其中一个,我QApplication
的基于程序也可以正常工作-这只是运气/巧合还是有效?
谢谢你的帮助!
打电话是否有效,qApp->exec()
或者QCoreApplication::exec()
我正在使用QApplication
实例?由于它是一个静态函数,因此在这两种情况下QCoreApplication::exec()
都会被调用。但是,似乎即使我调用其中一个,我QApplication
的基于程序也可以正常工作-这只是运气/巧合还是有效?
谢谢你的帮助!
QT 在 QApplication 上使用单例模式,因此您的所有调用最终都会调用 QApplication 的单个实例。为什么他们选择把 qApp 放在一边很奇怪,但它似乎是输入最短的字符串。我更喜欢保留指向您自己创建的原始 QApplication 的指针。
简短的回答:
这不是运气,因为静态函数的行为也应该像普通的非虚拟函数一样。
长答案:
静态函数是不使用this指针的成员函数。当你从一个对象调用它时,它的行为就像一个普通的成员。
由于 QAppliction 是从 QCoreApplication 派生的,而 exec() 是 QCoreApplication 的成员,它也是从 QCoreApplication 派生的类型的对象的成员。
qApp 返回一个指向 QApplication 对象的指针,该对象也是一个 QCoreApplication,因此它也包含 exec()。
qApp
简直就是一个#define
to QCoreApplication::instance()
。你使用它所做的一切qApp
就是告诉编译器在哪里找到exec()
函数。但是因为exec()
它是一个静态函数,所以它不是通过对象调用的,即使你的代码使它看起来像它。所以从编译器的角度来看qApp->exec()
应该是完全等价的。QCoreApplication::exec()
也就是说,我不知道qApp
在这种情况下 C++ 标准是否需要为非空,即使它在技术上不需要使用。