Это действительно, чтобы позвонить qApp->exec()
или же QCoreApplication::exec()
если я использую QApplication
пример? Поскольку это статическая функция, в обоих случаях QCoreApplication::exec()
будет называться. Тем не менее, похоже, что даже если я позвоню одному из них, мой QApplication
основанная программа работает просто отлично — это всего лишь удача / совпадение или это действительно?
Спасибо за вашу помощь!
Короткий ответ:
Это не удача, поскольку статические функции должны вести себя как обычные не виртуальные функции.
Длинный ответ:
Статическая функция — это функция-член, которая не использует этот указатель. Когда вы вызываете его из объекта, он ведет себя как обычный член.
Поскольку QAppliction является производным от QCoreApplication, а exec () является членом QCoreApplication, он также является членом объектов типов, производных от QCoreApplication.
qApp возвращает указатель на объект QApplication, который также является QCoreApplication, поэтому он также включает exec ().
qApp
это просто #define
в QCoreApplication::instance()
, Все qApp
делает в вашем использовании это говорит компилятору, где найти exec()
функция. Но потому что exec()
это статическая функция, она не вызывается через объект, даже если ваш код выглядит так, как он есть. Так qApp->exec()
должно быть полностью эквивалентно QCoreApplication::exec()
с точки зрения компилятора. Тем не менее, я не знаю, потребует ли стандарт C ++ qApp
быть ненулевым в этом случае, хотя технически его не нужно использовать.
QT использует одноэлементный шаблон в QApplication, поэтому все ваши вызовы в конечном итоге вызывают один экземпляр QApplication. Почему они решили использовать qApp для поездки, странно, но кажется, что это самая короткая строка для ввода. Я предпочитаю хранить указатель на оригинальное приложение QApplication, которое вы создали сами.