QT 4: программирование GUI на С++
Шрифт:
Директивы #include в строках 1 и 2 разворачивают содержимое заголовочных файлов cstdlib и iostream, которые являются частью стандартной библиотеки С++. Стандартные заголовочные файлы не имеют суффикса .h. Угловые скобки вокруг имен файлов говорят о том, что заголовочные файлы располагаются в стандартном месте системы, в то время как кавычки заставляют компилятор просматривать текущий каталог. Директивы #include обычно собирают вместе и располагают в верхней части файла .cpp.
В отличие от файлов .cpp, заголовочные
До сих пор мы предполагали, что исполняемый модуль состоит только из объектных файлов. На практике они компонуются также с библиотеками, которые реализуют готовую функциональность. Существует два основных типа библиотек:
• статические библиотеки непосредственно помещаются в исполняемый модуль, как будто они являются объектными файлами. Это гарантирует невозможность потери библиотеки, но увеличивает размер исполняемого модуля;
• динамические библиотеки (называемые также совместно используемыми библиотеками или библиотеками DLL) располагаются в стандартном месте на машине пользователя и автоматически загружаются во время запуска приложения.
Программу square мы компонуем со стандартной библиотекой С++, которая реализована как динамическая библиотека на большинстве платформ. Сами средства разработки Qt представляют собой коллекцию библиотек, которые могут создаваться как статические или как динамические библиотеки (по умолчанию они создаются как динамические библиотеки).
Основные отличия языков
Теперь мы более внимательно рассмотрим области, в которых С++ отличается от Java и C#. Многие языковые различия объясняются особенностями скомпилированных модулей С++ и повышенным вниманием к производительности. Так, С++ не проверяет границы массивов на этапе выполнения программы и не существует сборщика мусора, восстанавливающего неиспользуемую, динамически выделенную память.
Для краткости не будут рассматриваться те конструкции С++, которые почти идентичны соответствующим конструкциям Java и C#. Кроме того, здесь не раскрываются некоторые темы С++, потому что их изучение необязательно при программировании с применением Qt. К ним относятся шаблонные классы и функции, определение объединений и использование исключений. Полное описание языка можно найти в таких книгах, как «The С++ Programming Language» (Язык программирования С++) , написанной Бьерном Страуструпом, или «С++ for Java Programmers» (С++ для программистов Java), написанной Марком Аленом Уайссом (Mark Allen Weiss).
Элементарные типы данных
Предлагаемые в С++ элементарные типы данных аналогичны тем, которые используются в Java или C#. На рис. Б.2 приводятся список элементарных типов С++ и их определение на платформах, поддерживаемых Qt 4:
• bool — булево
• char — 8-битовый целый тип,
• short — 16-битовый целый тип,
• int — 32-битовый целый тип,
• long — 32- или 64-битовый целый тип,
• long long[9] — 64-битовый целый тип,
• float — 32-битовое значение числа с плавающей точкой (IEEE 754),
• double — 64 битовое значение числа с плавающей точкой (IEEE 754).
По умолчанию short, int, long и long long — типы данных со знаком, т.е. они могут содержать как отрицательные, так и положительные значения. Если необходимо хранить только неотрицательные целые числа, мы можем поставить ключевое слово unsigned (без знака) перед типом. Если тип short может хранить любое значение в промежутке между —32,768 и +32,767, то unsigned short — от 0 до 65 535. Оператор сдвига вправо >> имеет семантику чисел без знака («заполнить нулями»), если один из операндов является типом без знака.
Тип bool может принимать значения true и false. Кроме того, числовые типы могут использоваться вместо типа bool; в этом случае 0 соответствует значению false, а любое ненулевое значение означает true.
Тип char используется для хранения как символов ASCII, так и 8-битовых целых чисел (байтов). Целое число, представленное этим типом, в зависимости от платформы может иметь или не иметь знак. Типы signed char и unsigned char могут использоваться для однозначной интерпретации типа char. Qt предоставляет тип QChar, который хранит 16-битовые символы в кодировке Unicode.
По умолчанию экземпляры встроенных типов не инициализируются. Когда создается переменная типа int, ее значение вполне могло бы быть нулевым, однако с той же вероятностью оно может равняться —209 486 515. К счастью, большинство компиляторов предупреждает нас о попытках чтения неинициализированной переменной, и мы можем использовать такие инструментальные средства, как Rational PurifyPlus и Valgrind, для обнаружения обращений к неинициализированной памяти и других связанных с памятью проблем на этапе выполнения.
В памяти числовые типы (кроме long) имеют идентичные размеры на различных платформах, поддерживаемых Qt, но их представление меняется в зависимости от принятого в системе порядка байтов. В архитектурах с прямым порядком байтов (например, PowerPC и SPARC) 32-битовое значение 0x12345678 последовательно занимают четыре байта 0х12 0x34 0x56 0х78, в то время как в архитектурах с обратным порядком байтов (например, Intel x86) последовательность байтов будет обратной. Это следует учитывать в программах, копирующих области памяти на диск или посылающих двоичные данные по сети. Класс Qt QDataStream, представленный в главе 12 («Ввод—вывод»), можно использовать для хранения двоичных данных независимым от платформы способом.