Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
A.doc
Скачиваний:
36
Добавлен:
09.04.2015
Размер:
5.6 Mб
Скачать

0 Глава 1

Программирование в Visual С++ 2005

Программировать под Windows вовсе не трудно. Фактически Microsoft Visual С++ 2005 делает этот процесс изумительно легким, и вы убедитесь в этом, прочитав эту книгу. Есть лишь одно препятствие на этом пути: прежде, чем обратиться к специ- фике программирования Windows, вы должны быть хорошо знакомы со средствами языка программирования С++, в частности, с его объектно-ориентированными аспек- тами. Техника объектно-ориентированного программирования является ключом к эф- фективности всех инструментов среды Visual С++ 2005, используемых при создании программ для Windows, поэтому очень важно, чтобы вы добились хорошего ее пони- мания. Именно на это и нацелена настоящая книга.

Данная глава предлагает обзор важнейших концепций, касающихся программиро- вания приложений на языке С++. Мы проведем для вас краткий экскурс в интегриро- ванную среду разработки (Integrated Development Environment — IDE), поставляемую вместе с Visual С++ 2005. Эта среда проста и интуитивно понятна во всех своих опера- циях, поэтому, начав ею пользоваться, вы сможете очень быстро овладеть большин- ством ее возможностей. Лучший подход к изучению среды разработки — пройти весь процесс создания, компиляции и исполнения простой программы. Прочитав эту гла- ву, вы изучите следующие вопросы.

  • Из каких основных компонентов состоит Visual С++ 2005?

  • Из чего состоит среда .NET Framework, и каковы ее преимущества?

  • Что такое решение и проект, и как их создавать?

  • Что собой представляют консольные программы?

  • Как создавать и редактировать программы?

  • Как компилировать, компоновать и исполнить консольную программу на С++?

  • Как создать и выполнить базовую программу Windows?

Итак, включайте свой ПК, запускайте Windows, загружайте могучий Visual С++ 2005 и начинайте путешествие.

Среда .NET Framework

.NET Framework — центральная часть Visual С++ 2005, как и всех прочих средств разработки .NET компании Microsoft. Среда .NET Framework состоит из двух эле- ментов: общеязыковой исполняющей среды (Common Language Runtime — CLR), в которой выполняются ваши программы, и набора библиотек, называемых библи- отеками классов .NET Framework. Библиотека классов .NET Framework обеспечивает функциональную поддержку, которая необходима вашему коду при выполнении под управлением CLR, независимо от применяемого языка программирования, поэтому программы .NET, написанные на С++,С# или любом другом языке, поддерживающем .NET Framework, используют одни и те же библиотеки .NET.

Существуют два принципиально отличающихся вида приложений С++, которые можно разрабатывать в Visual С++ 2005. Вы можете писать приложения, которые вы- полняются на вашем компьютере как "родные" (native). Эти программы будем назы- вать родными программами С++. Такие программы пишутся на версии языка С++, определенной стандартом ISO/ANSI. Вы также можете разрабатывать программы, выполняющиеся под управлением CLR и реализованные с помощью расширенной версии С++, которая носит название C++/CLI. Эти программы мы будем называть программами CLR, или программами C++/CLI.

.NET Framework не является частью Visual С++ 2005, а скорее компонентом опера- ционной системы Windows, который облегчает построение приложений и Web-служб. Каркас .NET Framework представляет ощутимые преимущества в отношении надеж- ности кода и безопасности, а также возможностей интегрирования вашего кода С++ с кодом, написанным на более чем 20 других языках программирования, ориентиро- ванных на .NET Framework. Некоторым недостатком ориентации на .NET Framework является незначительное снижение производительности, которое в большинстве слу- чаев вообще незаметно.

Общеязыковая исполняющая среда (CLR)

CLR — это стандартизованная среда выполнения программ, написанных на ши- роком диапазоне высокоуровневых языков, включая Visual Basic, С# и, разумеется, С++. Спецификации CLR в настоящее время встроены в стандарт ЕСМА (European Association for Standardizing Information and Computer Systems — Европейская ассоци- ация по стандартизации информационных и вычислительных систем) инфраструк- туры общего языка (Common Language Infrastructure — CLI) — ECMA-335, а также в аналогичный стандарт ISO — ISO/TEC 23271, поэтому CLR представляет собой реа- лизацию этого стандарта. Вы видите, почему С++ для CLR называется С++/CLI — это С++ для CLI, поэтому весьма вероятно, что со временем вы будете иметь дело с ком- пиляторами С++/CLI для других операционных систем, которые реализуют CLI.

Обратите внимание, что информация о стандартах ЕСМА доступна на сайте http: // www. ecma-international. org, а стандарт ECMA-335 в настоящее время доступен для бесплатной загрузки.

CLI — это, по сути, спецификация среды виртуальной машины, которая позволя- ет приложениям, написанным на разнообразных высокоуровневых языках програм-

мирования, выполняться в различных системах без изменения и перекомпиляции оригинального исходного кода. CLI специфицирует стандарт промежуточного языка виртуальной машины, в который компилируется исходный код высокоуровневого языка программирования. В .NET Framework этот промежуточный язык называется Microsoft Intermediate Language (MSIL). Код этого промежуточного языка в конеч- ном итоге при выполнении программы отображается на машинный код с помощью оперативного компилятора (just-in-time —JIT). Конечно, код на промежуточном язы- ке CLI может функционировать только в среде, для которой существует реализация CLI.

CLI также определяет общий набор типов данных, называемый общей системой типов (Common Туре SystemCTS), который должен использоваться программами, написанными на любом языке, ориентированными на реализацию CLI. CTS специ- фицирует то, как применяются типы данных внутри CLR, и включает в себя набор предопределенных типов. Вы можете также определять собственные типы данных, но их определение должно подчиняться ряду правил, чтобы они были согласован- ными с CLR. Наличие стандартизованной системы типов для представления данных позволяет компонентам, написанным на разных языках, обрабатывать данные уни- фицированным способом и обеспечивает возможность интеграции компонентов, на- писанных на разных языках, в одно приложение.

Безопасность данных и надежность программ в значительной степени расширены CLR, отчасти благодаря тому, что динамическое выделение и освобождение памяти полностью автоматизированы, а отчасти потому, что код программ MSIL полностью верифицируется перед выполнением программы. CLR — это только одна из реализа- ций спецификации CLI, которая функционирует под управлением Microsoft Windows на ПК. Несомненно, появятся и другие реализации CLI для сред других операцион- ных систем и аппаратных платформ. Вы наверняка заметите, что иногда термины CLI и CLR используются взаимозаменяемо, хотя должно быть очевидным, что это не одно и то же. CLI — спецификация стандарта, a CLR — реализация CLI от Microsoft.

Написание приложений на С++

Visual С++ 2005 обеспечивает чрезвычайную гибкость в части разработки разно- образных типов приложений и программных компонентов. Как уже упоминалось в настоящей главе, существуют два основных варианта приложений Windows: вы може- те писать код, который выполняется под CLR, а можете писать код, компилируемый непосредственно в "родной" машинный код операционной системы. Для приложе- ний Windows, ориентированных на CLR, в качестве базы построения GUI (graphical user interface — графический интерфейс пользователя) используется каркас Windows Forms, представленный библиотекой базовых классов .NET Framework. Применение Windows Forms обеспечивает быструю разработку GUI, поскольку вы собираете его графически из стандартных компонентов и получаете полностью автоматически сге- нерированный код. Затем нужно будет лишь провести небольшую настройку сгенери- рованного кода, чтобы добиться необходимой функциональности.

Для получения "родного" исполняемого кода также имеется несколько способов. Один из них — использование библиотеки классов Microsoft Foundation Classes (MFC) для программирования графического интерфейса пользователя Windows-приложе- ния. MFC инкапсулирует программный интерфейс операционной системы Windows (Windows API) в части создания и управления GUI, и значительно облегчает процесс разработки программ. Windows API появился задолго до того, как на сцену вышел

6 Глава 1

язык С++, поэтому он не имел никаких объектно-ориентированных характеристик, которых следовало бы ожидать, если бы он разрабатывался в наши дни. Однако вы не обязаны применять MFC. Если вам нужен выигрыш в производительности, то вы можете из своего кода С++ обращаться к Windows API непосредственно.

Код С++, выполняемый под управлением CLR, называется управляемым С++, пото- му что данные и код находятся под контролем CLR. В программах CLR освобождение памяти, динамически выделенной для размещения данных, осуществляется автомати- чески, что позволяет исключить главный источник ошибок "родных" приложений С++. Код С++, который выполняется вне CLR, иногда называется в документации Microsoft неуправляемым С++, поскольку CLR в его выполнении не участвует. В неуправляемом С++ вы должны самостоятельно заботиться о выделении и очистке памяти во время выполнения программы, и вам придется самостоятельно обеспечивать безопасность, которая встроена в CLR. Мы также будем называть неуправляемый С++ родным С++, потому что он компилируется непосредственно в родной машинный код.

На рис. 1.1 показаны основные варианты выбора, которые у вас есть при разра- ботке приложений С++.

Рис. 1.1. Основные варианты выбора, доступные при разработке приложений на С++

На рис. 1.1 представлена не полная картина. Приложение может состоять частич- но из управляемого С++ и частично — из родного кода, то есть вы не привязаны к одной или другой среде. Конечно, смешивая разнородный код, вы кое-что теряете, поэтому поступать так нужно только при необходимости, например, когда вы со- бираетесь перенести существующие родное приложение С++ под управление CLR. Понятно, что вы не сможете получить выгоды, присущие управляемому С++ в родном коде С++, к тому же взаимодействие между управляемыми и неуправляемыми компо- нентами программы влечет за собой определенные накладные расходы. Однако воз- можность смешения управляемого и неуправляемого кода может оказаться чрезвычай- но полезной, когда нужно разработать или расширить существующий неуправляемый код, но при этом в некоторых местах использовать преимущества CLR. Конечно, при

разработке новых приложений нужно в самом начале решить, должен быть его код управляемым или нет.

Изучение программирования для Windows

С интерактивными приложениями, выполняемыми под Windows, всегда связаны два аспекта: необходим код для создания графического интерфейса (GUI), с которым взаимодействует пользователь, и необходим код для обработки этого взаимодействия и реализации полезной функциональности приложения. Visual С++ 2005 предоставля- ет вам великолепную поддержку в разработке обоих аспектов приложений Windows. Как вы увидите далее в настоящей главе, можно создать работающую программу Windows с GUI, не написав самостоятельно ни строчки кода. Весь базовый код по соз- данию GUI может быть сгенерирован автоматически Visual С++ 2005; однако важно понимать, как работает этот автоматически генерируемый код, поскольку вам потре- буется расширять и модифицировать его, чтобы заставить выполнять нужную вам ра- боту, а для этого понадобится всестороннее понимание С++.

По этой причине в этой книге вы сначала изучите сам С++ — как родной С++, так и версию С++/CLI — не погружаясь в рассмотрения программирования под Windows. Только после того, как почувствуете себя уверенно в С++, вы научитесь разрабатывать полноценные приложения Windows с помощью родного С++ и C++/CLI. Это значит, что, изучая С++, вы будете работать с программами, которые используют ввод и вы- вод командной строки. За счет ограничения этими простейшими средствами ввода и вывода, вы сможете сосредоточиться на специфике самого языка С++, избегая неиз- бежного усложнения, которое привносит построение и управление GUI. После того, как вы освоитесь с С++, вы будете в состоянии просто и естественно перейти к при- менению этого языка в разработке полноценных Windows-приложений.

Изучение С++

Visual С++ 2005 в полной мере поддерживает две версии С++, определенные двумя разными стандартами.

  • Стандарт С++ ISO/ANSI для реализации "родных" приложений — неуправляе- мый С++. Эта версия С++ поддерживается большинством компьютерных плат- форм.

  • Стандарт C++/CLI, разработанный специально для написания программ, ори- ентированных на CLR, и являющийся расширением ISO/ANSI С++.

Главы от 2 до 10 научат вас языку С++. Поскольку C++/CLI является расширением ISO/ANSI С++, первая часть каждой главы представляет элементы языка ISO/ANSI С++, а вторая часть — дополнительные средства C++/CLI.

Написание программ на C++/CLI позволит в полной мере воспользоваться пре- имуществами .NET Framework, которые зачастую недоступны программам, написан- ным на ISO/ANSI С++. Хотя C++/CLI— расширение ISO/ANSI С++, для того, чтобы программа полностью выполнялась под CLR, она должна отвечать определенным требованиям CLR. Это означает, что некоторые средства ISO/ANSI С++ нельзя при- менять в программах CLR. Как вы могли догадаться из сказанного выше, одним из примеров таких ограничений может быть запрет на использование средств ISO/ANSI С++ распределения и освобождения памяти. Они не совместимы с C++/CLI, и вместо них вы должны будете пользоваться механизмом управления памятью CLR, а это зна- чит, что вы должны работать с классами C++/CLI, а не родными классами С++.

Стандарты С++

Стандарт ISO/ANSI определен в документе ISO/IEC 14882, опубликованном Аме- риканским национальным институтом стандартизации (ANSI). Стандарт ISO/ANSI С++ описывает устойчивую версию С++, которая существует с 1998 года и поддержи- вается компиляторами большинства аппаратных компьютерных платформ и операци- онных систем. Программы, написанные на ISO/ANSI С++, относительно легко могут быть перенесены с одной платформы на другую, хотя используемые ими библиотеч- ные функции, в частности, связанные с построением графического интерфейса, явля- ются главным фактором, определяющим, насколько легко или трудно такой перенос осуществить. Стандарт С++ ISO/ANSI — это главный инструмент, который выбирают профессиональные разработчики программ, поскольку он широко поддерживается и потому, что на сегодняшний день он является одним из наиболее мощных доступных языков программирования.

Стандарт С++ ISO/ANSIможно приобрести наhttp://www. iso.org.

C++/CLI — версия С++, расширяющая стандарт С++ ISO/ANSI в целях лучшей под- держки общей инфраструктуры языка (CLI), определенной в стандарте ЕСМА-355. Первый набросок этого стандарта появился в 2003 году и был разработан на основе технических спецификаций, представленных Microsoft для поддержки программ С++ в среде .NET Framework. То есть, как CLI вообще, так и C++/CLI в частности, роди- лись в Microsoft и предназначены для поддержки .NET Framework. Конечно, стандар- тизация CLI и C++/CLI значительно повысила вероятность появления реализаций в средах, отличных от Windows. Важно оценить то, что хотя C++/CLI — это расши- рение ISO/ANSI С++, существуют такие средства ISO/ANSI С++, которые не следует использовать в программах, предназначенных полностью для выполнения под управ- лением CLR. Далее в книге вы узнаете об этом подробнее.

CLR представляет существенные преимущества перед "родным" окружением. Ориентируя ваши программы С++ на CLR, вы обеспечиваете их повышенную безо- пасность и снижаете уязвимость по отношению к потенциальным ошибкам, которые возможны при использовании всех средств ISO/ANSI С++. CLR также исключает не- совместимость между различными высокоуровневыми языками программирования за счет стандартизации целевой среды, для которой выполняется компиляция, что позволяет комбинировать модули, написанные на С++, с модулями, написанными на других языках, таких как С# или Visual Basic.

Консольные приложения

Наряду с разработкой приложений для Windows, Visual С++ 2005 также позволя- ет вам писать, компилировать и тестировать программы С++, которые не тащат за собой всего багажа, необходимого программам Windows — то есть символьно-ориен- тированные программы командной строки. Эти программы называются в Visual С++ 2005 консольными приложениями, потому что вы взаимодействуете с ними через клавиатуру и экран, работающий в символьном режиме.

Написание консольных приложений может показаться вам отклонением от основ- ной цели программирования Windows, но когда речь идет об изучении С++ (что совер- шенно необходимо перед тем, как погрузиться в программирование Windows) — это наилучший способ. Даже в самой простой Windows-программе присутствует слишком много кода, и очень важно, чтобы сложности, связанные с программированием под Windows не затмили для вас азы С++. Поэтому в начальных главах нашей книги, со-

средоточенных на основах работы С++, мы потратим некоторое время на рассмотре- ние нескольких "легковесных" консольных приложений, прежде чем перейдем к "тя- желовесному" коду мира Windows.

Таким образом, изучая С++, вы сможете сосредоточить внимание на языковых средствах, не заботясь о среде, в которой они работают. В консольных приложениях, которые вы разработаете в процессе изучения, вы будете иметь дело только с тек- стовым интерфейсом, но этого вполне достаточно для понимания С++, поскольку в определении языка отсутствует описание каких-либо средств графики. Естественно, я представлю всю необходимую информацию о программировании графического пользовательского интерфейса, когда очередь дойдет до написания программ под Windows с применением MFC на "родном" С++ и с применением Windows Forms — на C++/CLI.

Существует два вида консольных приложений, и вы будете иметь дело с обоими. Консольные приложения Win32 компилируются в родной код, и их мы будем рас- сматривать при изучении средств ISO/ANSI С++. Консольные приложения CLR ориентированы на CLR, поэтом)' их мы будем использовать для работы со средствами C++/CLI.

Концепции программирования для Windows

Наш подход к Windows-программированию будет основан на полном использо- вании инструментов, представленных Visual С++ 2005. Средства создания проек- та, встроенные в Visual С++ 2005, позволяют автоматически сгенерировать скелет кода для широкого диапазона различных прикладных программ, включая базовые Windows-программы. Создание проекта — это начальная точка при разработке всех приложений и компонентов в Visual С++ 2005, и для того, чтобы получить представ- ление о том, как это делается, в настоящей главе вы ознакомитесь с процессом созда- ния некоторых примеров, включая набросок программы для Windows.

Программы Windows имеют структуру, отличающуюся от обычных консольных программ, которые запускаются из командной строки, к тому же они значительно сложнее. В консольной программе вы можете получать ввод с клавиатуры и отправ- лять вывод непосредственно в командную строку, в то время как Windows-програм- ма может работать со средствами ввода и вывода компьютера только через функции, предоставленные операционной системой Windows; никакого прямого доступа к ап- паратным ресурсам не допускается. Поскольку в Windows могут быть активными од- новременно несколько программ, Windows определяет, какая из них должна получить ввод — щелчок мыши или нажатие клавиши — и соответственно оповещает нужную программу. То есть общее управлением всем взаимодействием с пользователем осу- ществляется операционной системой Windows.

К тому же природа интерфейса между пользователем и приложением Windows та- кова, что в любой момент времени возможно самое разнообразное воздействие на программу. Пользователь может выбрать любой из пунктов меню, щелкнуть на кноп- ке панели инструментов или же щелкнуть кнопкой мыши в любом месте окна при- ложения. Хорошо спроектированное приложение Windows должно быть готовым об- рабатывать ввод любого рода в любой момент времени, поскольку заранее не может быть известно, какое именно воздействие произойдет. Все эти действия пользователя принимаются в первой инстанции операционной системой, и рассматриваются ею как события (events). Событие, воспринятое пользовательским интерфейсом вашего приложения, обычно приводит к выполнению определенного кусочка кода програм- мы. Таким образом, что именно делает программа — определяется последовательное-

тью действий пользователя. Программы, работающие таким образом, называются программами, управляемыми событиями (event-driven programs), и отличаются от традиционных процедурных программ, которые имеют единственную последователь- ность выполнения. Ввод данных в процедурной программе управляется кодом самой программы и может выполняться только тогда, когда программа принимает его; в противоположность этому Windows-программа состоит, прежде всего, из фрагмен- тов кода, реагирующих на события, вызванные действиями пользователя либо самой Windows. Структура такого рода программ показана на рис. 1.2.

Каждый квадратный блок на рис. 1.2 представляет порцию кода, написанную спе- циально для обработки определенного события. Программа может выглядеть силь- но фрагментированной из-за множества не связанных между собой блоков кода, но основной фактор, связывающий ее в единое целое — это сама операционная система Windows. Вы можете считать свою программу индивидуальной подгонкой Windows для выполнения определенного набора действий.

Конечно, все модули, обслуживающие различные внешние события, такие как вы- бор пункта меню или щелчок мыши, имеют доступ к общему набору специфичных для приложения данных в конкретной программе. Эти данные приложения содержат информацию, имеющую отношение к тому, для чего программа предназначена, на- пример, блоки текста в редакторе или таблица рекордов игрока в программе, пред- назначенной для отслеживания результатов игры бейсбольной команды, а также информацию о некоторых событиях, которые произошли во время выполнения про- граммы. Эта общая коллекция данных позволяет разным частям программы, которые выглядят независимыми, взаимодействовать согласованным образом. Позднее в этой книге мы рассмотрим это более детально.

Даже самая элементарная Windows-программа включает несколько строк кода, а когда речь идет о программах Windows, сгенерированных автоматическими мастера- ми (wizards) из Visual С++ 2005, то "несколько" превращается в "много". Чтобы упро- стить процесс понимания работы С++, вам нужен контекст, упрощенный, насколько это возможно. К счастью, среда Visual С++ 2005 обеспечивает такую возможность.

Что такое интегрированная среда разработки?

Интегрированная среда разработки (Integrated Development Environment — IDE), которая поставляется вместе с Visual С++ 2005 — это полностью самодостаточная среда, предназначенная для создания, компиляции, компоновки и тестирования про- грамм на С++. Она также представляет собой великолепное учебное пособие по языку С++ (особенно в сочетании с хорошей книгой).

Visual С++ 2005 включает в себя множество полностью интегрированных инстру- ментов, предназначенных для облегчения написания программ на С++. С некоторыми из них вы познакомитесь в этой главе, но вместо скучного абстрактного перечисле- ния средств и опций, сначала будет дано общее представление о работе IDE, а затем постепенно будут раскрываться детали, в контексте изучаемого материала.

Программирование в Visual С++ 2005 11

Рис. 1.2. Структура типичной Windows-программы

Компоненты системы

Список фундаментальных составляющих Visual С++ 2005, поставляемых как ча- сти IDE, включает в себя редактор, компилятор, компоновщик и библиотеки. Это — основные инструменты, необходимые для написания и исполнения программ С++. Их назначение описано ниже.

Редактор

Редактор представляет собой интерактивную среду, в которой вы можете созда- вать и редактировать исходный код С++. Наряду с обычными средствами вроде вы- резания и вставки фрагментов, с которыми вы наверняка знакомы, редактор также обеспечивает цветовое выделение различных элементов языка. Редактор автоматиче- ски распознает ключевые конструкции языка С++ и окрашивает их в соответствии с их значением. Это не только помогает сделать код более читабельным, но также ясно указывает на ошибки при вводе некоторых слов.