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