QT 4: программирование GUI на С++
Шрифт:
Приложение Б. Введение в С++ для программистов Java и С#
Данное приложение представляет собой краткое введение в язык С++, предназначенное для разработчиков, знакомых с Java или C#. Предполагается, что вы знакомы с такими концепциями объектно—ориентированного программирования, как наследование и полиморфизм, и хотите обучиться программированию на С++. Чтобы эта книга не стала громоздким 1500—страничным томом, включающим в себя полный учебник по С++ для начинающих, это приложение ограничивается изложением только существенных вопросов. В нем представлены основные понятия и методы, необходимые для понимания программ,
На момент написания книги язык С++ представляет собой единственное реальное средство написания межплатформенных, высокопроизводительных объектно—ориентированных приложений с графическим пользовательским интерфейсом. Недоброжелатели С++ обычно отмечают, что программировать на Java или C#, который отошел от поддержки совместимости с языком С, более приятно; на самом деле Бьерн Страуструп (Bjarne Stroustrup), создатель С++, отмечал в книге «The Design and Evolution of C++» (Дизайн и эволюция С++), что «внутри С++ существует очень компактный и более аккуратный язык, изо всех сил стремящийся получить известность».
К счастью, при программировании в рамках Qt мы обычно придерживаемся некоторого подмножества С++, которое сильно приближается к утопическому языку, о котором говорил Страуструп, что позволяет нам сконцентрировать свое внимание непосредственно на текущей проблеме. Более того, Qt в некоторых аспектах расширяет С++ благодаря своему новаторскому механизму «сигналов и слотов», поддержке кодировки Unicode и ключевому слову foreach.
В первом разделе данного приложения мы увидим, как можно объединять несколько файлов, содержащих исходный код С++, для получения исполняемой программы. Это приведет нас к изучению таких центральных концепций С++, как единица компиляции, заголовочные файлы, объектные файлы, библиотеки, и ознакомит с препроцессором, компилятором и компоновщиком С++.
Затем мы рассмотрим наиболее важные отличия языков С++, Java и C#, связанные с определением классов, использованием указателей и ссылок, перегрузками операторов, применением препроцессора и т.д. Несмотря на то что синтаксис С++ очень похож на синтаксис Java и C#, имеется тонкое отличие базовых концепций. В то же время язык С++, под влиянием которого coздaвaлиcь Java и C#, имеет много общего с этими двумя языками, в частности аналогичные типы данных, те же самые арифметические операторы и одинаковые основные операторы управления.
Последней раздел посвящен стандартной библиотеке С++, которая обеспечивает функциональность, готовую к применению в любой программе на С++. Эта библиотека развивалась в течение более 30 лет и поэтому вобрала в себя многие подходы, в том числе процедурный, объектно—ориентированный и функциональный стили программирования, а также макросы и шаблоны. По сравнению с библиoтeкaми Java и C# стандартная библиотека С++ имеет довольно ограниченную область применения; она не поддерживает программирование графического пользовательского интерфейса, многопоточную обработку, базы данных, интернационализацию, работу с сетями, XML и Unicode. Для применения С++ в этих областях предполагается, что разработчики С++ должны использовать различные библиотеки (часто зависимые от платформы).
Именно здесь приходит на помощь Qt. Сначала средства разработки Qt представляли собой межплатформенный
Первое знакомство с С++
Программа С++ состоит из одной или нескольких единиц компиляции. Каждая единица компиляции представляет собой отдельный файл исходного кода, обычно имеющий расширение .cpp (другими распространенными расширениями являются .cc и .cxx); она обрабатывается компилятором за один шаг. Для каждой единицы компиляции компилятор генерирует объектный файл с расширением .obj (в Windows) или .о (в Unix и Mac OS X). Объектный файл — это бинарный файл, содержащий машинный код для той архитектуры, на которой будет выполняться программа.
После компиляции всех файлов .cpp мы можем собрать все объектные файлы для создания исполняемого модуля, используя специальную программу, называемую компоновщиком (linker). Компоновщик соединяет объектные файлы в единое целое и назначает адреса памяти функциям и другим символическим ссылкам, которые содержатся в единицах компиляции.
Рис. Б.1. Процесс компиляции программы на С++ (в Windows).
При создании программы только одна единица компиляции должна иметь функцию main, которая является точкой входа в программу. Эта функция не принадлежит никакому классу — она является глобальной функцией.
В отличие от Java, где каждый исходный файл должен содержать точно один класс, С++ позволяет организовать единицу компиляции удобным для нас способом. Можно реализовать несколько классов в одном файле .cpp или распространить реализацию класса на несколько файлов .cpp; имена исходных файлов могут быть любыми. При внесении изменений в один конкретный файл .cpp потребуется перекомпилировать этот файл и затем повторно скомпоновать приложение для создания нового исполняемого модуля.
Прежде чем мы пойдем дальше, давайте рассмотрим очень простую программу на С++, вычисляющую квадрат целого числа. Эта программа состоит из двух единиц компиляции: main.cpp и square.cpp.
Ниже показан файл square.cpp:
Этот файл содержит лишь глобальную функцию с именем square, которая возвращает квадрат своего параметра.