Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Штерн В. - Основы C++. Методы программной инженерии - 2003

.pdf
Скачиваний:
267
Добавлен:
13.08.2013
Размер:
28.32 Mб
Скачать

20

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

Это очень важная деталь. В программе на C + + вызов функции обычно связан с использованием двух объектов. Один объект посылает сообщение (вызывает функцию), а другой — получает его (иногда говорят о нем как об адресате со­ общения). Назовем объект, отправляющий сообщение, объектом-клиентом, а получателя сообщения — объектом-сервером. Подобная терминология напо­ минает системную архитектуру клиент/сервер, но смысл ее совсем иной. Эти термины стали применяться в объектно-ориентированном программировании намного раньше, чем приобрели популярность первые клиент-серверные системы. В данной книге много рассказывается о клиент-серверных связях между объекта­ ми в программе C++ .

Как будет показано позднее, объекты в программе C + + синтаксически весьма напоминают обычные переменные — целочисленные, символьные, с плавающей точкой. Распределение памяти для них очень похоже на распределение памяти для обычных переменных: она выделяется в стеке или в динамической области (см. ниже). Класс в С+Н это синтаксическое расширение того, что в других языках называется структурами или записями, позволяющими сгруппировать компоненты данных. Класс C + + включает в себя описания данных и функций.

Таким образом, когда клиенту нужно использовать объект, в частности срав­ нить идентификационный номер (ID) с заданным значением или присвоить элементу значение розничной цены, то имен полей данных указывать не нужно. Вместо этого вызывается предусмотренная объектом функция. Такие функции выполняют для клиента всю работу: сравнивают ID или присваивают значение цены.

Преимущества применения объектов

На первый взгляд, указание имен функций вместо имен полей данных объекта дает небольшой выигрыш, на самом деле это не так. Опыт показывает, что проек­ тирование структур данных — более подвержено изменениям, чем проектирова­ ние операций. Благодаря использованию имен функций, а не полей данных, код клиента изолируется от потенциальных изменений в объекте-сервере. Тем самым повышается сопровождаемость программы, а это одна из важных целей ООП.

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

Короче говоря, цель ООП та же, что и других методов разработки ПО — по­ вышение качества ПО в соответствии с потребностями конечного пользователя (функциональности программы, обш,ей стоимости ее разработки и сопрово>вдения).

Сторонники объектно-ориентированной технологии надеются, что она позво­ лит сделать программный код менее сложным. Это, в свою очередь, способно уменьшить число ошибок в ПО, повысить продуктивность его разработки и сопро­ вождения.

Сложность ПО можно уменьшить путем разбиения программ на относительно независимые части с незначительным количеством ссылок на другие фрагменты. В таких частях нетрудно разобраться по отдельности. Применяя в качестве про­ граммных единиц классы, также можно сократить число взаимосвязей между частями программы, однако придется увеличить число взаимосвязей между частями класса: функции-члены класса работают с одними и теми же данными.

Глава 1 • Объектно-ориентированный подход: что это такое?

Но и это не проблема: разработкой класса обычно занимается один человек, а потому не потребуются многочисленные согласования со всеми возможными упущениями и непониманием. Ослабление зависимости между классами сводит к минимуму потребность в координации между участниками проектной команды, отвечаюндими за разные классы, и уменьшает число ошибок.

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

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

Конечно, ООП не освобождает от риска и расходов. Разработчиков, пользова­ телей и менеджеров придется обучать, а стоимость такой подготовки значительна. Кроме того, сроки реализации объектно-ориентированных систем обычно больше, особенно на первых этапах проекта (анализ и проектирование). Объектно-ориен­ тированные программы содержат больше строк исходного кода, чем обычные. (Пугаться не стоит — речь идет именно о строках исходного, а не объектного кода. Размер выполняемого кода, как правило, не зависит от методологии разработки.) Что еще более важно, языки, поддерживающие объектно-ориентированное про­ граммирование, достаточно сложны (особенно C+ + ). Их применение связано с определенным риском: преимущества не всегда достигаются. Объектно-ориен­ тированные программы могут быть сложнее, медленнее обычных, вызывать трудности при сопровождении. В данной книге рассказывается, как всего этого избежать и правильно использовать C+ + . Должное применение такого мощного и стимулирующего языка, как C + + поможет реализовать все обещания ООП.

Характеристики языка программирования С+ +

С+Н надстройка над языком программирования С. Сам язык С — это на­ следие нескольких поколений более ранних языков. Он создавался для достиже­ ния противоречивых целей. Вот почему C + + содержит несогласованные и иногда раздражающие средства. В данном разделе вкратце рассказано об основных характеристиках С, поясняется, как создатели C + + использовали это наследие для достижения своих целей.

Цели языка С; производительность, удобочитаемость, красота и переносимость

Первая цель создания языка С состояла в том, чтобы предоставить язык программирования разработчикам высокопроизводительных систем. Вот почему в С и C + + не поддерживается проверка ошибок этапа выполнения. Это способ­ но привести к некорректному поведению программы, но может выявляться про­ граммистом в процессе тестирования. В С и C + + имеются операторы низкого уровня, эмулирующие команды ассемблера и позволяющие программисту непо­ средственно управлять ресурсами компьютера — регистрами, портами, маска­ ми, флагами и пр.

Внимание Те, кто не знает, что означают регистры, порты и флаги, могут

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

22 -lacTb I # Введение в прогрог^и^ировоние на С+4'

Вторая цель создателей языка С состояла в том, чтобы предложить разработ­ чикам ПО язык высокого уровня для реализации сложных алгоритмов и структур данных, поэтому языки С и C + + позволяют программистам использовать циклы, условные операторы, функции и процедуры. Именно поэтому в С и C + + поддер­ живается обработка различных типов данных, массивов, структур и динамического управления памятью. (Если вам эти термины не знакомы, не беспокойтесь — изучению C + + по данному руководству это не помешает.) Эти средства обеспечи­ вают удобство обслуживания и чтения программного кода.

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

Четвертая цель языка С — поддержка переносимости программы на уровне исходного кода. Не следует ожидать, что выполняемая программа на С или C+ + будет работать в разных ОС и на разных аппаратных платформах. Теоретически один и тот же исходный код должен поддерживаться несколькими компиляторами и разными платформами без каких-либо изменений. Точно так же, предполагается, что для получения программы, работаюш^ей на разных платформах, изменений не потребуется.

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

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

Четвертая цель, переносимость программ С, также была достигнута, но со значительными оговорками. Сам по себе язык переносимый: если его операторы скомпилировать в разных ОС, то программа будет выполняться одинаково. Весь фокус в том, что программа может содержать не только операторы языка С, но и многочисленные вызовы библиотечных функций.

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

Идея неплохая. Вся проблема в переносимости. Если разные компиляторы и платформы используют различные библиотечные функции, то программу не перенести на другую платформу, не изменяя вызовов функций. Ее нельзя даже перекомпилировать с помош.ью другого компилятора. Кроме того, такой подход затрудняет "переносимость" не только программы, но и программиста. Если он изучил одну библиотеку, придется осваивать другую.

Глава 1 • Объектно-ориентированный подход: что это такое?

| 23 р

Проблема весьма существенная, поэтому поставщики компиляторов для раз­ ных платформ признавали важность разработки "стандартной" библиотеки, кото­ рую программисты могли бы использовать на разных машинах без значительных модификаций программного кода. Предполагается, что определенные изменения все же потребуются. Из-за отсутствия единого центра стандартизации было раз­ работано несколько версий ОС UNIX, компиляторов и библиотек для машин разных производителей. В разных ОС и на разных платформах эти компиляторы и библиотеки ведут себя по-разному.

Национальный институт стандартов США (American National Standards Institute, ANSI) провел определенную работу по стандартизации языка С в 1983—1989 гг. с целью обеспечения его переносимости. В ANSI-версии языка С были реализова­ ны некоторые новые идеи, но с соблюдением требований обратной совместимости, так что унаследованный код С можно было перекомпилировать с помощью нового компилятора.

Сегодня, хотя исходный код С в основном переносим, проблемы остаются: перенос программы на другую машину или ОС может потребовать изменений. Навыки программистов, знающих язык С, также в основном "переносимы": можно перейти к другой среде разработки, почти не переучиваясь (но некоторая переподготовка все же потребуется).

Разработчики языка С не увидели проблемы появления разных библиотек. Платить за эту "гибкость" приходится дополнительными расходами на перенос программного кода и переобучение программистов. Опыт, накопленный отраслью при разрешении этих проблем,— одна из причин столь пристального внимания разработчиков языка Java унификации стандартов. Язык Java очень строг и поме­ чает многие идиомы С как синтаксические ошибки. При разработке Java вопрос обратной совместимости с С был одним из низкоприоритетных. Очевидно, разра­ ботчики Java не захотели продолжать эту линию.

Цели языка C+ + :

классы и обратная совместимость с языком С

Одной из целей создания C + + было расширение возможностей языка С за счет объектно-ориентированного подхода к программированию. "Расширение" здесь не стоит понимать буквально. C + + проектировался для 100-процентной обратной совместимости с С: все программы на языке С являются вполне "закон­ ными" программами C+ + . (Некоторые исключения есть, но они не столь важны.) Следовательно, C + + наследует из С все особенности и средства, хорошие или плохие ("...пока смерть не разлучит нас").

Аналогично С, язык С+Н лексемно-ориентированный и различает регистр символов. Компилятор разбивает исходный код на слова-компоненты независимо от позиции в строке — их не надо расставлять по определенным столбцам, как в Фортране или Коболе. Он игнорирует все пробелы между лексемами, и програм­ мисты могут использовать это, чтобы сделать исходный код более читабельным. Различие регистра символов помогает избежать конфликтов имен, но приведет к ошибкам, если программист не обратит внимания на разницу в написании имен (или у него просто не хватит на это времени).

В C+ + , как и в С, имеется всего несколько базовых типов «йгсловых да})- ных — меньше, чем в других современных языках. Кроме того, некоторые из этих базовых типов имеют разные диапазоны на разных машинах. Еще более осложня­ ет дело то, что программисты могут использовать так называемые модификаторы типов, изменяющие допустимый диапазон значений на конкретной машине. Этовлияет как на переносимость ПО, так и на удобство его сопровождения.

Чтобы компенсировать скудость типов данных, C + + поддерживает их агреги­ рование — создание сложных типов: структур, массивов, объединений, перечис­ лений. Совокупности данных можно комбинировать в другие совокупности. Это средство также заимствовано из языка С.

24

I

Часть j # Введение в програттироваимв но ^

 

 

C + + поддерживает стандартный набор конструкций управления ходом выпол­

 

 

нения программы: последовательное выполнение операторов и вызовов функций,

 

 

итеративное выполнение операторов и блоков операторов (for, while, циклы do),

 

 

операторы перехода по условию (if,

switch), безусловные переходы (break, continue

 

 

и, конечно, goto). Это такой же

набор, как в С, но есть некоторые различия

 

 

в использовании циклов for.

 

 

 

C+ + , как и его предшественник,— язык с блочной структурой. Неименован­

 

 

ные блоки кода допускают вложенность любого уровня, а переменные вложенных

 

 

блоков "невидимы" для внешних. Это позволяет программистам, пишущим вло­

 

 

женные блоки, использовать любые имена локальных переменных, не опасаясь

 

 

конфликтов имен (а, стало быть, нет необходимости координировать названия

 

 

переменных с программистами, пишущими другие блоки).

 

 

Но функции С (и C+ + ), например именованный блок, не допускают вложен­

 

 

ности в другие функции, а имена функций должны быть в программе уникальны.

 

 

Это серьезное ограничение. Оно требует координации между программистами

 

 

на этапе разработки и усложняет сопровождение программы. В C++ данная

 

 

проблема частично исправлена за счет введения области действия класса. Методы

 

 

класса (т. е. определенные в классе функции) должны быть уникальны только

 

 

в классе, а не в программе.

 

 

 

Как и функции в языке С, функции C++ могут вызываться рекурсивно. Другие

 

 

языки рекурсивный вызов не поддерживают, поскольку рекурсивные алгоритмы

 

 

используются достаточно редко. Непродуманное применение рекурсии может

 

 

привести к излишним затратам времени и памяти при выполнении программы.

 

 

Между тем есть несколько алгоритмов, где рекурсия особенно полезна, а потому

 

 

в современных языках программирования (но не в языках сценариев — скрип­

 

 

тах) — это стандартное средство.

 

 

 

Функции C+ + , как и функции С, могут помещаться в один или несколько ис­

 

 

ходных файлов, компилируемых и отлаживаемых отдельно, что позволяет разным

 

 

программистам независимо работать над разными частями проекта. Скомпилиро­

 

 

ванные объектные файлы можно позднее скомпоновать, получив выполняемый

 

 

объектный файл. Очень важное свойство для разделения работ при реализации

 

 

крупных проектов.

 

 

 

С+Н

язык со строгим контролем типов, что очень напоминает С. Исполь­

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

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

Вто же время C++ является языком со слабым контролем типов (да, не удив­ ляйтесь — и сильный и слабый одновременно) и даже в большей степени, чем С.

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

C++ унаследовал от С применение указателей. Здесь они используются в трех целях: для передачи параметров из вызывающей функции в вызываемую, для динамического распределения памяти из динамической области (heap), если необ­ ходимо организовать, например динамические структуры данных, и для работы с массивами в компонентах-массивах. Все методы работы с указателями могут вести к ошибкам. Такие ошибки особенно трудно обнаружить, локализовать и исправить.

Глава 1 Объектно-ориентированный подход: что это такое?

•.й!^^1Щ

25

Как и С, язык C+-i- проектировался из соображений эффективности. Границы массивов не проверяются ни на этапе компиляции, ни на стадии выполнения. Программист сам должен позаботиться о целостности программы и избежать порчи других областей памяти из-за неверного индекса элемента массива — весьма распространенный источник ошибок в программах на C/C+ + .

Подобно языку С, C++ разработан для написания компактного исходного кода. Здесь придается особый смысл таким знакам пунктуации, как звездочки, знаки равенства, скобки, запятые и т. д. Эти символы могут иметь в программе на C+ + разный смысл. Их значение зависит от контекста, что затрудняет изучение C + + по сравнению с другими языками.

В C + + добавлен ряд новых средств. Наиболее важное — поддержка объек­ тов. В C + + структуры С расширены до классов, позволяющих связать вместе в одной единице кода функции и данные. Применение классов способствует со­ крытию информации за счет локализации представления данных в определенных границах. Вне класса компоненты данных будут недоступны. Классы поддержи­ вают инкапсуляцию. Для этого предлагаются функции доступа (методы), вызы­ ваемые клиентом. Применение области действия класса уменьшает вероятность конфликтов имен в программе C+ + .

Классы способствуют также иерархическому подходу к проектированию — классы более высокого уровня повторно используют классы низкого уровня. Композиция и наследование классов позволяют программисту строить сложные модели реального мира и легко манипулировать компонентами программы.

В языке есть и ряд других средств, помогающих проектировщику выразить свои намерения в самом коде программы, а не в комментариях.

Между тем, как и С, язык C + + разработан для опытных программистов. Компилятор не пытается думать за программиста, предполагая, что разработчик программы знает, что делает. Если разработчик неаккуратен, программа на C + + может получиться весьма сложной и трудной для чтения, модификации, сопро­ вождения. Преобразование типов, операции с указателями, обработка массивов и передача параметров часто становятся источниками трудно обнаруживаемых ошибок.

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

Итоги

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

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

иудобству его сопровождения. Применение классов устраняет конфликты имен

иоблегчает понимание исходного кода.

26

Часть I # Введег

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

^ # / ^ s

ыстрыи старт: краткий обзор С+ +

Темы данной главы

•^ Базовая структура программы

^Директивы препроцессора •^ Комментарии

^Описания и определения

^Операторы и выражения

^Функции и вызовы

^Классы

^Применение средств разработки программного обеспечения

^Итоги

^^ ^ данной главе вкратце рассмотрены основные конструкции програм-

Ш^^ •[ЛЬи.мирования на языке C+ + . В последующих главах они обсуждаются

^ ^^^'^Z^ подробнее. Поскольку С+Н достаточно большой язык, то "краткий" обзор означает не рассказ собственно о языке, а описание действительно важных его средств, хотя оно может оказаться и не таким уж кратким. Тем не менее попро­ буем найти разумный компромисс.

Изучение такого языка, как C++, по предлагаемым им средствам не даст об­ щей картины, позволяющей связать различные средства в единое целое. Многие из них нельзя обсуждать по отдельности. Именно поэтому необходима вводная глава, которая познакомит читателей с самыми важными концепциями и конст­ рукциями языка C+ + , даст возможность написать первые программы на C+ +

иподготовиться к более полному изучению этих принципов и методов.

Впрограммах, приведенных в книге, применяется стандарт C++ ISO/ANSI. В эту версию языка добавлены новые средства и изменен синтаксис некоторых существующих средств. Между тем во многих компиляторах реализована лишь часть средств нового языка. Вряд ли можно обсудить различия в реализации стан­ дарта C++ подробно — слишком много разных поставщиков и разных версий компиляторов. В конечном счете старые компиляторы будут заменены новыми вер­ сиями, однако в течение многих лет отрасли придется иметь дело с программами на C++, соответствующими старым стандартам. Поскольку одной из важных целей C++ является обратная совместимость, такой старый код будет поддерживаться

28

Часть I« Введение в програм1^ирование на С4-4^

новыми компиляторами. Добавление в стандарт C++ новых средств не отменяет старых. Как правило, здесь описывается новый синтаксис C++, хотя явно об этом не упоминается. Где необходимо, дается краткая ссылка на старые способы напи­ сания программного кода, что позволит читателям увереннее чувствовать себя с "унаследованными" программами.

Базовая структура программы

Листинг 2.1 показывает исходный код вашей первой программы на C + + . Эта программа знакомит читателей с миром C++; (как любая первая программа в книге по программированию). Кроме того, она демонстрирует больше средств, чем обычная классическая программа, показываюш^ая сообп^ение "Hello, World". Здесь выполняются некоторые вычисления, а на печать выводится значение pi (3,1415926) в степени 2.

Листинг 2.1. Первая программа на C + +

#inclucle <iostreani> #inclucle <cmath> using namespace std;

/ / директива компилятора const double PI = 3.1415926;

int main(void)

{

double x=PI, y=1, z;

cout « "Добро пожаловать в мир C++!" « endl;

z= у + 1;

у= pow(x, z);

cout «

"Вэтом мире pi в квадрате равно

« у «

cout «

"Приятного дня!" « endl;

 

return

0;

 

}

/ /

директива

препроцессора

/ /

директива

препроцессора

/ / определение константы

// функция возвращает целое значение

// определение переменных

/ /

вызов функции

/ /

операция присваивания

/ /

вызов функции

endl;

 

/ /

конец блока функции

Пусть вас не смущает, если программа кажется не совсем понятной. К концу данной главы вы будете понимать все детали не только этой программы.

Аналогично другим современным языкам программирования, C++ позволяет давать компилятору команду в виде удобочитаемого исходного кода. Компилятор C++ транслирует исходный код в машинно-читаемый объектный код. При ис­ полнении программы последовательно выполняются команды машинного языка, и получается результат.

Большая часть вычислений производится со значениями, хранимыми в памяти компьютера. Мы будем рассматривать память компьютера как массив ячеек, содержаш,их значения. К ячейкам нельзя обраш,аться по храняш^имся в них значе­ ниям. Это делается с помош^ью числовых адресов (в объектном коде) или по сим­ волическим именам (в исходном коде). Например, первый оператор программы C++ содержит:

Z = у + 1;

Он указывает компилятору, что нужно извлечь значение, храняш,ееся в ячейке у, увеличить его на 1 (без изменения содержимого ячейки) и поместить результат в ячейку Z. Реальные адреса ячеек определяются в выполняемом, а не в исходном коде. Программист работает с этими символическими именами — его не интере­ сует, какие адреса памяти компилятор присваивает каждому имени.

Глава 2 # Быстрый старт: кратк1^й обзор С Ф +

29

В реальной памяти целым значениям, числам с плавающей точкой и символам (тексту) выделяется разное число битов и байтов, а во время выполнения эти биты обрабатываются по-разному. Для корректной генерации выполняемого кода компилятору нужно понимать намерения программиста. Вот почему перед выпол­ нением оператора z = у + 1; компилятору необходимо сообщить, что у и z дейст­ вительно представляют собой символические имена ячеек в памяти (а не функций, к примеру), и что хранимые в памяти под этими именами значения имеют тип double (один из типов C + + для вещественных чисел).

Таким образом, большую часть исходного кода составляют определения объек­ тов, с которыми работает программа (здесь это имена х, у и z, другие задаются в директивах #inclucle и #clef ine), или описания того, что нужно сделать с объек­ тами (сложение, присваивание, передача параметра функции).

Исходный код программы C + + может быть обычным текстовым файлом, созданным в текстовом редакторе типа Emacs или Vi в UNIX, Edt в VMS или в интегрированной среде разработки (Integrated Development Environment, IDE) на PC или Mac. Мы предполагаем, что он сохраняется в файле на жестком диске.

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

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

арасширения средства разработки добавляют автоматически. Нестандартные расширения придется указывать явно.

Вфайле исходного кода могут определяться несколь­

ко функций (в приведенной выше программе C+ +

Добро

пожаловать в мир C++!

 

функция только одна — ее имя main). Нередко про­

В этом

мире pi в квадрате

равно 9.8696

грамма состоит

из

нескольких исходных

файлов

Приятного

дня!

 

 

 

Press

any

key to continue.

 

 

(эта — только

из

одного). Каждый исходный файл

 

 

 

 

 

 

 

должен компилироваться для получения объектного

 

 

 

 

 

 

 

файла. Большинство сред разработки требуют ком­

 

 

 

 

 

 

 

поновки

скомпилированной программы (объектных

Рис.

2 . 1 . Вывод первой

программы C++,

файлов). Лишь после этого программа может выпол­

няться. (Подробнее о компоновке рассказано ниже.)

 

 

 

полученной

с

помощью

 

 

 

компиляпп,ора

Microsoft

На рис. 2.1 показан

результат

выполнения

первой

 

 

 

 

 

 

 

 

 

 

программы C+ + .

 

 

 

 

 

Этот результат был получен исполнением файла,

 

 

 

 

 

 

 

 

C:\WINDOWS>echo off

 

 

 

сгенерированного компилятором Microsoft Visual C++,

Добро пожаловать в мир C++!

9.8696

 

Professional

Edition version 6.0. Данный

компилятор

В этом мире pi

в квадрате равно

 

входит в состав пакета Microsoft Development Studio,

Приятного дня!

 

 

 

 

 

Press any key

to

continue,

 

 

объединяющего

несколько

средств

разработки.

C:\WINDOWS>

 

 

 

 

 

Программа вызывалась приложением Development

 

 

 

 

 

 

 

Studio. Последняя строка вывода ("Нажмите любую

 

 

 

 

 

 

 

клавишу...") сгенерирована компилятором, а не про­

Рис. 2.2.

Вывод первой программы

C++,

граммой. В противном случае окно сразу исчезло бы

 

запущенной

в приглашении

DOS

с экрана и пользователь не смог бы проверить ре­

 

 

 

 

 

 

 

зультат. Старые версии компилятора Microsoft не

 

 

 

добавляют данное сообщение, но все равно не удаляют окно с экрана — это должен

 

 

 

сделать пользователь. Программа может исполняться так же, как автономное

 

 

 

приложение, непосредственно в командной строке DOS. В этом случае последняя

 

 

 

строка йе появляется. На рис. 2.2 показан результат выполнения данной програм­

 

 

 

мы при запуске в DOS.

 

 

 

 

 

 

 

 

 

 

 

 

Численный результат может несколько различаться на разных машинах. Это

 

 

 

зависит от заданного по умолчанию числа цифр в результате. C + +

позволяет

 

 

 

программисту явно задать формат вывода, не полагаясь на установки компилято­

 

 

 

ра, но формат — вещь довольно сложная, и пока мы его рассматривать не будем.

 

 

 

Примеры будут приведены ниже.

 

 

 

 

 

 

Соседние файлы в предмете Программирование на C++