Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
Второе издание
А Beginner's Guide
Second Edition
HERBERT SCHILDT
МсGга\\'-Нill/0sЬогпе
J'\C\\' \"OJ'k
Cllicago SaIl r:raIlCISCO
Lj,IЮII 1\1;JIJI'i(\ Мсхн;о Cil\' Мilап
L,1'11I\01l
;-\l'\" Dcll11 ~ап.lШJl SCOII\ Sll1gal"JI'(" SY(\IlC\' ')urUlllU
РУКОВОДСТВО дпя начинающих
Второе издание
ГЕРБЕРТ шилдт
•
!\10СКВ(\ • C<J.hkt-ПетсрGург
2005
• KIlt'B
ББК 32.973.26-018.2.75
Ш57
УДК 681.3.07
Шилдт, Герберт.
Ш57 С++: руководство для начинаlOЩИХ, 2-е издание. : Пер. сангл. - М. : Издатель-
ский дом "Вильямс", 2005. - 672 с. : ил. - Парал. тит. аш·л.
в этой книге описаны ocHoBныe средства языка С++, которые необходимо осво
ить начинающему программисту. После рассмотрения элементарных поWJТИЙ
(переменнblX, операторов, инструкций управления, функций, классов и объеК10В)
читатель легко перейдет к изучениlO таких БОJtее сложных тем, как перегрузка опе
раторов, механизм обработки исключительных ситуаций (искточений), наследова
ние, полиморфизм, виртуальные функции, средства ввода-вывода и шаблоны. Aв'rop
справочника - общепризнанный авторитет в области программирования на языках
С и С++, Java и С# - включил в свою книry множество тестов для саМОКОНТРОJIJl,
которые ПОЗВОJIJlЮТ быстро проверить степень освоеиия материала, а также раздcлы
"воnpосов и ответов", способствующие более глубокому изучения основ програм
мирования даже на начальном этапе.
ББК 32.973.26-018.2.7S
Об авторе 15
Введение 17
Модуль 1. Основы С++ 21
Модуль 2. Типы данных и операторы 69
Модуль З. Инструкции управления 109
Модуль 4. Массивы, СТрОI<И и указатели 157
Модуль 5. Введение в фУНI<ЦИИ 211
Модуль 6. О функциях подробнее 261
МОДУЛЬ 7. Еще о типах данных и операторах ЗОЗ
Модуль 8. I<лассы и объекты З49
Модуль 9. О классах подробнее З97
Модуль 10. Наследование 465
МОДУЛЬ 11. С++-система ввода-вывода 521
Модуль 12. Исключения, шаблоны и кое-что еще 571
Приложение А. Препроцессор 639
Приложение Б. Использование устаревшего С++-компилятора 65з
Предметный указатель 656
Содержание
Об авторе 15
Введение 17
Как организована эта книга 17
Практичсские навыки 1.8
Тсст для самоконтроля 18
Вопросы для текущего контроля 18
Спросим у опытного программиста 18
Учсбные проекты 18
Никакого предыдущего опыта в области программирования не требуется 18
Требуемое программное оБССllсчение 19
Программный код - из Web-пространства 19
Для далЫlсйшего изучения программирования 19
Модуль 1. Основы С++ 21
1.1. Из истории создания С++ 22
Язык С: начало эры современного программирования 23
Предпосылки ВОЗIШКlЮВСНИЯ языка С++ 24
Рождение С++ 25
Эволюция С++ 26
1.2. Связь С++ с языками Java и С# 27
1.3. Объектно-ориентированное программирование 29
Инкапсуляция 30
Полиморфизм 31
Наследование I
32
1.4. Создание, компиляция и выполнение С++-программ 32
Ввод текста программы 34
Компилирование программы 34
Выполнение программЬ! 35
Построчныii "разбор полетов" первого ПРИl\fера IJporpaMMbl 36
Обработка синтаксических ошибок 38
1.5. Использование нсремснных 1\0
1.6. Использование операторов 41
1.7. Сt"пываllие данных с клавиатуры 44
Вариации на тему вывода данных 46
Познакомимся еше с одним ТIlIЮМ даJlНЫХ 47
1.8. Использование IfНСТРУКЦИЙ управления if и (ог 52
С++: PYI<OBOACTBO для. начинающих 7
Инструкция if 52
Цикл for 54
1.9. Использование блоков кода 56
Точки с запятой и расположение инструкций 58
Практика отступов 59
1.10. Понятие о функциях 62
Библиотеки С++ 64
1.12. Ключевые слова С++ 65
1.13. Идентификаторы 66
Модуль 2. Типы данных и операторы 69
Почему типы данных столь важны 70
2.1. Типы данНЫХ С++ 70
Целочисленный тип 72
Символы 75
Типы данных с плавающей точкой 77
Тип данных Ьооl 78
Тип void 80
2.2. Литералы 83
Шестнадцатеричные и восьмеРИЧllые литералы 84
Строковые литералы 84
Управляющие символьные последователыfстии 85
2.3. Со:щаиие инициализироваlfНЫХ переменных 87
Инициализация псременной 87
Динамическая инициалllзация переменных 88
Операторы 89
2.4. Арифметические операторы 89
Инкремент и декремент 90
2.5. Операторы отношений и логические операторы 92
2.6. Оператор присваинания 98
2.7. Составные операторы приспаивания 99
2.8. П реобраэопание типов в операторах присваиваиия 100
Выражения 101
2.9. Прео6раэование типов в оыраЖСIlИЯ-Х 101
Пре06разооаIlИЯ, связанные с типом bool 1()2
2.10. Приведение тшlOВ 102
2.11. Использование пробелов If КРУГЛЫХ скобок 104
8 Содержание
учебными проектами, поэтому, про работав весь материал этой книги, вы получи
те глубокое понимание основ С++-программирования.
Я хочу подчеркнуть, что эта книга - лишь стартовая площадка. С++ - это
большой (по объему средств) и не самый простой язык программирования. Не
обходимым условием успешного программирования на С++ является знание не
только ключевых слов, операторов и синтаксиса, определяющего возможностн
пройденный материал.
18 Введение
Практические навыки
Все модули содержат рюдслы (отмеченные n и KTO!l)aM мой" Важно! "), которые
важно не ПРОПУСТИТЬ при lIзучеllИИ материала юшги. ИХ ЗШ\ЧИМОСТI. ДЛЯ IJОСЛ~
доватсльного освоения lюдчеркивается тем, что они про~умерованы и Ilеречис
Учебные проекты
Каждый модуль включает ОДИН [lJ111 нескоЛ\.ко просктов, которые 1l0ЮlзЫВ;t
ют, как Шl праКТlше можно прнмеНИТf> ИЗJlожеlIныi, здесь материал. ЭТII учебвые
Ilроекты представляют собой реальные примеры, КОТОРЫС можно IIСIЮЛI>ЗОВ"ТЬ JJ
качестве стартовых вариантов для ваших программ.
Требуемое программное
обеспечение
Чтобы СКОМrII1;IIIРol),l1'Ь и 8ЫПОЛIIIIТl. программы, приведенные в этой книге,
вам ПОllадобится любой 1'13 таких современных компиляторов, как Visual С++
(MicrosQft) JI С++ Builder (Borland).
Те, КТО желает подробнее изучить ЖIЫК С++, могут обратиться к следую
ЩИМ книгам.
• Полный сnравочнuк по С,
• Освой самостолmелыlO С.
Если вам нужны четкие ответы, обращ8ЙТеСЬ к ГербеJ7IY Шилдту, общепризнанво
му авторитету в области ПрОf1>аммирования.
От издательства
Вы, читатель этой КIIИrn, и есть главный ее критик и комментатор. Мы ценим
ваше мнение и хотим знать, что было сделано нами правильно, что можно было сде
лать лучше и что еще вы хотели бы увидеть изданным нами. Нам интересно УС.1Ы
шать и любые другие замечания, которые вам хотелось бы высказать в наш адрес.
Мы ждем ваших комментариев и надеемся t: а них. Вы можете при слать нам
бумажное или электронное письмо, либо просто посетить наш Web-сервер и
оставить свои замечания там. Одним словом, любым удобным для вас способо.\{
дайте нам знать, нравится или нст вам эта книга. а также выскажите свое мнение
о том, как сделать наши книги более интересными ДЛЯ вас.
Посылая письмо или сообщение, не забудьте указать название книги и ее авто
ров, а также ваш обратный адрес. Мы внимательно ознакомимся с вашим мнением
и обязательно учтем его при отборе и подготовке к изданию последующих книг.
Наши координаты:
E-таН: info@williamspublishing.c:)m
WWW: http://www.williamspublishing.com
Информация для писем из:
России: 115419, Москва, а/я 783
Украины: 03150, Киев, а/я 152
МОДУЛЬ 1
ОСНОВЫ С++
ВАЖНОI
,ММ ИЭИСТnРИId СО3ДnWИАu-С+* /
Рождение С++
Язык С++ был создан Бьерном Страуструпом (Bjame Stroustrup) в 1979 году
в компании ВеН Laboratories (г. Муррей-Хилл, шт. Нью-Джерси). Сиачала но
вый язык получил имя "С с классами" (С with Classes), но в 1983 году он стал
называться С++.
Страуструп построил С++ на фундаменте языка С, включающем все его
средства, атрибуты и основные достоинства. Для него также остается в силе
принцип С, согласно которому программист, а не язык, несет ответственность
за результаты работы своей программы. Именно этот момент позволяет понять,
что изобретение С++ не было попыткой создать новый язык программирова
ния. Это было скорее усовершенствование уже существующего (и при этом
весьма успешного) языка.
Большинство новшеств, которыми Страуструп обогатил язык С, было предна
значено для поддержки объектно-ориентированного программирования. По сути,
С++ стал объектно-ориентированной версией языка С. Взяв язык С за основу,
Страуструп подготовил плавный переход к ооп. Теперь, вместо того, чтобы из
учать совершенно новый язык, С-программисту достаточно было· освоить только
ряд новых средств, и он мог пожинать плоды использования 06ъектно-ориенти
рованной технологии программироваиия.
Создавая С++, Страуструп понимал, иасколько важно, сохранив изначальную
суть языка С, Т.е. его зффективность, гибкость и принципы разработки, внести в
него поддержку объеКТlю-ориеllТИРОВaJlНОl"O орограммирования. К счастью, эта
цель была достигнута. С++ по-прежнему предоставляет программисту свободу
действий и власть над компьютером (которые были присущи языку С), значи
тельно расширяя при этом его (программиста) возможности за счет использова
ния объектов.
26 Глава 1. Основы С++
Эволюция С++
С момента изобретения С++ претерпел т~,и крупные l1ереработки, причем
каждый раз язык как ДОПОJlllЯЛСЯ новыми средствами, так и в чем-то изменялся.
Первой ревизии он был подвергнут в 1985 году. второй - в 1990, а третья произо
шла в процессе стандартизации, который актюшзировался в начале 1990-х. Спе
циально для этого был сформирован объединенный АNSI/ISО-комитет (я был
его членом), который 25 января 1994 года принял первый проект предложенного
на рассмотрение стандарта. В этот проект БЫЛII включены все средства, впервые
определенные Страуструпом, и добавлены новые. Но в целом он отражал состоя
ние С++ на тот момент времени.
Вскоре после завершения работы над первым проектом стандарта С++ про
изошло событие, которое заставило значительно расширить существующий
стандарт. Речь идет о создании'Ллександром Степановым (Alexander Stepanov)
стандартной библиотеки шаблонов (Standar<\ Template Library - STL). Как
вы узнаете позже, STL - это набор обобщенных функций, которые можно ис
пользовать для обработки данных. Он доволыio большой по размеру. Комитет
ANSI/ISO проголосовал за включение STL в спеllИфикauию С++. добавление
STL расширило сферу рассмотрения средств С++ далеко за пределы исходнuго
определения ЯЗblка. Однако ВlUlючение STL. помимо прочего, замедлило процесс
стандартизации С++, причем довольно сущест)}еllllO.
Помимо STL, в сам ЯЗblК было добавлено н('сколько новых средств и внесено
множество мелких изменений. Поэтому верси.il С++ после рассмотрения коми
тетом по стандартизацЮ1 стала намного больше и сложнее по сравнению с ис
ходным вариантом Страуструпа. Конечный результат работы комитета датиру
ется 14 ноября 1997 года, а [lеалыlO ЛNSI/ISО-стандарт языка С++ увидел Сllет
в 1998 году. Именно эта спецификация С++ ОnЫЧJlО называется Standard С++.
и именно она описана в данной книге. Эта версия С++ поддерживается всеми
ОСНОВJlЫМИ C++-компилятораМII, включая Vistl<ll С-Н (Мiсrоsоft) и С++ Buildct·
С++: руководство для начинающих 27
ВАЖНОI
58 0 бьектнn-nр и еЫZИРОВQ нн ое
программирование
Основополагающими для разработки С++ стали принципы объектно-ори
ентированного программирования (ООП). Именно ООП явилось толчком для
создания С++. А раз так, то, прежде чем мы напишем самую простую С++-про
грамму, важно понять, что собой представляют принципы ООП.
Объектно-ориентированное программирование объединило лучшие идеи
структурированного с рядом мощных концепций, которые способствуют более
эффективной организации программ. В самом общем смысле любую программу
можно организовать одним из двух способов: опираясь на код (действия) или на
данные (информация, на l<ОТОРУЮ направлены эти действия). При использова
нии лишь методов структурированного программирования программы обычно
опираются на код. Такой подход можно выразить в использовании "кода, дей
ствующего на данные".
Механизм объектно-ориентированного программирования основан на выборе
второго способа. В этом случае ключевым принципом организации программ яв
ляется использование "данных, управляющих доступом !( коду". В любом 06ъек
тно-ориентированном языке программирования определяются данные и процеду
ры, которые разрешается применить к этим данным. Таким образом, тип данных в
точности определяет, операции какого вида можно примешпь к этим данным.
ИнкапсуМlЦИЯ
Инкапсуляция - это такой механизм программирования, который связывает
воедино код и данные, им обрабатываемые, чтобы обезопасить их как от внешне
го вмешательства, так и от неправильного исrlOJlьзоваиия. В объекпю-ориеНnf
рованиом языке код и данные могут быть связаны способом, при котором созда
ется самодостаточный черный ЯЩlJК. В этом "яшике" содержатся все необходимые
(для обеспечения самостоятельности) данные If код. При таком связывании кода
и данных создается объект, Т.е. 06ьекm - это КО:iСТРУКЦИЯ, котuрая поддерживает
инка.псу ляцию.
Внутри объекта код, данные или обе эти составляющие могут быть закРЫТЫ\fИ
в "рамках" этогообъекта или открытыми. Закрытый код (или данные) известен и
доступен только другим частям того же объекта. Другими словами, к закрытому
коду или данным не может получить доступ та часть программы, которая суще
ствует вне этого объекта. Открытый код (или данные) доступен любым другим
частям программы, даже если они определены [. других объектах. Обычно откры
тые части объекта используются для предоставления управляемого интерфейса
с закрытыми элементами объекта.
Базовой единицей инкапсуляции является класс. Класс определяет новый тип
данных, который задает формат 06ьекта. Класс' включает как данные, так и код,
предназначенный ДЛЯ выполнения над этими данными. Следовательно, класс
связы8em данные с "адом. В С++ спецификация класса используется для по-
С++: PYI(OBOACTBO ДЛ~ начинающих 31
ПолиморфИЗМ
Полиморфизм (от греческого <:Л.ова polym01p11ism, означающего "много форм") -
это свойство, позволяющее исnользовать один интерфейс для целого lUIacca дей
ствиii. В качестве простого примера полиморфизма можно привести руль автомоби
ля. Лля руля (т.е. шперфейса) безразлично, какой пш рулеоого механизма исполь
зуется u автомобиле. Другим словами, руль работает одинаково. не:iависимо от того,
оснащеli ли автомобиль рулевым управлением прямоro деЙСТВIIЯ (без усилителя),
рулевым управлением с УСИЛИТeJlем или механизмом реечной lIсредачи. Если вы
знаете, как обращаться с рулем, вы сможете вести автомоБИЛI, любого ТИП8.
ТОТ же IIРИНЦИП можно применить к программировClНИJO. Рассмотрим, напри
мер, стек, или список, добавление и удаление элементов к !{оторому осуществля
ется по ПРИIiЦИПУ "последним прибыл - пеРПl)IМ обслужен". У "ас может быть
программа, А которой используются три различных типа стека. Один стек пред
назначен ДЛЯ цеЛОЧJ1СЛСIШЫХ значений, второй - для значений с плавающей точ
кой и третий - для символов. AлrОРlfТМ реализации всех стеков - один и тот
же. несмотря на то, что 1:1 них хранятся данные различных типов. В необъектно
ориентированном языке программисту пришлось бы создать три различных ,.. а
бора подпрограмм обслуживания с.тека, причем подпрограммы должны были бы
иметь различные имена, а каждый набор - собственный интерфейс. Но благо
даря полиморфизму в С++ можно создать одии общий набор подпрограмм (один
интерфейс), который подходит для всех трех конкретных СИ1'УациЙ. Таким обра
зом, зная, как использовать один стек, вы можете использовать все остальные.
НаслеАование
Ншледованue - это процесс, благодаря которому один объект может при обретать
свойства дpyt·oгo. Благодаря наследованию ПОJl.ll.ерживается концепция иерархи
ческой классификации. В виде управляемой иерархической (нисходящей) класси
фикации организуется большинство областей знаний. Например, яблоки Красный
Делишее являются частью классификации яблоки, которая в свою очередь является
частью класса фрукты, а тот - частью еще большего класса пища. Таким образом,
класс пища обладает определеtШЫМИ качествами (съедобность, питательность и пр.),
которые применимы и к подклассу фрукты. Помимо этих качеств, класс фрукты
имеет специфические характеристики (сочность. сладость и пр.), которые отличают
их от других пищевых продуктов. В классе я6JЮКU определяются качества, специ
фичные для яблок (растут на деревЬЯХ, не тропические и пр.). Класс Красныйде:ш
шее наследует качества всех предыдущих классов и при этом определяет качес1'ва,
и выполнение C++-прОграмм
Пора приступить к программированию. Для этого рассмотрим первую про
стую С++-программу. Начнем с ввода текста, а затем перейдем к ее компиляции
и выполнению.
1*
Это простая С++-программа.
#include <iostrearn>
using namespace std;
return О;
}
Итак, вы ДОЛЖНЫ выполнить следующие действия.
2. Скомпилировать ее.
3. Выполнить.
34 Глава 1. Основы С++
Компилирование программы
Способ компиляции программы Sample. срр зависит от используемого ком
пилятора и выбранных ОIЩИЙ. Более того, многие компиляторы, например ViStlal
С++ (Мiсrоsoft) и С++ Builder (Borland), предоставляют два различных способа
компиляции программ: с помощью компилятора командной строки и интегриро
ванной среды разработки (lntegrated Development Environment - IDE). Поэтому
для компилирования С++-программ невозможно дать универсальные инструк
ции, которые подойдут для всех компиляторов. Это значит, что вы должны сле
довать инструкциям, приведенным в СОПРОВОДIfТельной документации, прилага
емой к вашему компилятору.
Но, если вы используете такие популярные компиляторы, как Visual С++
и С++ Builder, то проще всего в обоих случаях компилировать и выполнять про
граммы, приведенные в этой книге, с использованием компиляторов командной
С++: PYI<OBOACTBO для начинающих 35
Выполнение программы
Скомпилированная программа готова к выполнению. Поскольку результатом
работы С++-компилятора является выполняемый объектный код, то для запу
ска программы в качестве команды достаточно ввести ее имя в режиме работы
по приглашению. Например, чтобы выполнить программу Sample. ехе, исполь
зуйте эту командную строку:
/*
Это простая С++-программа.
#include <iostream>
С++: PYI<OBOACTBO Mt;\ начинающих 37
в языке С++ определеtI ряд зшоловков (header), которые обычно содержат ин
формацию, необходимую для программы. В нашу программу включен зaroловок
<iostream> (он используется ДЛЯ поддержки С++-системы ввода-вывода), ко
торый представляет собой внешний исходный файл, помещаемый компилятором
в начало программы с помощью директивы # incl ude. Ниже в этой книге мы
•
: +
: +
:U
::0
'111
:0
::1:
ближе познакомимся с заголовками и узнаем, почему они так важны.
:и
:0
Рассмотрим. следующую строку программы:
int main ()
Как сообщается в только что рассмотренном комментарии, именно с этой строки
и начинается выполнение программы.
функции. При нормальном завершении (т.е. без ошибок) все ваши программы
должны возвращать значение О.
Закрывающая фиrypная скобка в конце програММbJ формально завершает ее.
#include <iostream>
using namespace std;
int main ()
{
int length; // ~ Здесь об~.етCR переиеина•.
return О;
+
Как упоминалось выше, для С++-программ можно выбирать любые имена. +
u
Тогда при вводе текста этой программы дадим ей, скажем, имя VarDemo. срр. 2i
ID
О
Что же нового в этой программе? Во-первых, инструкция I:
(J
int length; // Здесь объявляется переменная. О
+ Сложение
Вычитание
* Умножение
/ Деление
// Использование оператора.
#include <iostream>
using narnespace std;
int rnain ()
{
int length; // Здесь объявляется п~ременная.
int width; / / Здесь объявляется В'l'орая переменная.
int area; // Здесь объявляется третья переменная.
return О;
#include <iostream>
using namespace std;
int main ()
{
int length; 11 Здесь объявляется переменная.
int width; /1 Здесь объявляется вторая переменная.
Хочу 06ратИ1:Ь ваше внимание на то, что с помощью одной и той же инструк
ции можно объявить не одну, а сразу несколько перемеНIiЫХ. Для этого достаточ
но разделить их имена запятыми. Например, переменные length, width и area
можно было бы объявить таким образом.
int length, width, area; 11 Все переменные объявлены в
// одной инструкции.
cin » vpr;
Здесь cin - еще ОДИН встроенный идентификаl0Р. Он составлен из частей слов
console input и автоматически померживается средстоами С++. По умолчанию
идентификатор cin связывается с клавиатурой, хотя ero можно перенаправИ1Ь
и на другие устроЙства. Элемент var означает переменную (указанную с правой
стороны от оператора "»"), которая принимает вводимые данные.
Рассмотрим новую версию программы вычисления площади, которая позво
ляет пользователю вводить размеры сторон прямоугольника.
/*
Интерактивная программа, которая вычисляет
площадь прямоугольника.
*/
iinclude <iostream>
int main () +
{
u+
:JS
11:1
int length: // Здесь объявляется переыеииая. О
:I:
Здесь объявляется вторая переме~ная.
int width: // 8
cout « "Введите длину прямоугольника: ":
cin » length: // ВВОД sначеВИR дnивu прсиоyr~RИXа
// (~.e. значеИИR аерекеввой lenqth)
/ / с 1UIaвKa~yp...
return О:
/*
в этой программе демонстрируется и,::пользование кода \п,
который генерирует переход на новую строку.
*/
finclude <iostream>
using namespace std;
int main ()
{
cout « "один\п";
cout « "два\п";
cout « "три";
cout « "четыре";
return О;
С++: руководство ДЛЯ начинающих 47
один
+
два
u+
тричетыре :i5
~
Символ новой строки можно размещать в любом месте строки, а не только в :r
конце. Вам стоит на практике опробовать различные варианты применения кода 8
\n, чтобы убедиться в том, что вам до конца понятно его назначение.
double result;
Здесь resul t представляет собой имя переменной, которая имеет тип
double.
Поэтому перемеииая resul t может содержать такие значеиия, как 88,56, 0,034
или -107,03.
Чтобы лучше понять разницу между типами дaJmыx iлt и double, рассмотрим
следующую npoграмму.
/*
Эта лрограмма иллюстрирует различия между типами
liлсludе <iostream>
using namespace std;
int mаiл () {
int ivar; // Здесь объявляется переменная типа int.
double dvar; // Здесь объявляется переменная типа double.
return О;
Последовательность действий
1. Создайте новый С++-фзйл с именем Ftc.M. срр. (Конечно, вы можете вы
брать для этого файла любое другое имя.)
#include <iostream>
using namespace std;
3. Начните определение функции main () с объявления переменных f и!'.1.
int main () {
double f; / / содержит длину в футах
double т; // содержит результат преобразоваНИR в метрах
6.
7.
Завершите программу следующим образом.
return О;
#include <iostrearn>
using narnespace std;
int rnain () {
double f; // содержит длину в футах
double т; // содержит результат преобразования в ме
трах
I
8. СJ,(омпилируйте и выполните программу. Вот как выглядит один из воз
можных результатов ее выполнения.
ИНСТРУКЦИЯ if
Можно избирательно выполнить часть программы, используя инструкцию
управления условием i f. Инструкция i f в С -\ + действует подобно инструкции
"IF", определенной в любом другом языке программирования (например C.Java
и С#). Ее простейший формат таков:
if(условие) инструкция;
Здесь элемент условие - это выражение, которое при вычислении может ока
заться равным значению ИСТИНА ИЛИ ЛОЖЬ. В С++ ИСТИНА представля
ется ненулевым значением, а ЛОЖЬ - нулем. Если условие, или условное вы
ражение, истинно, элемент инструкция выполнится, в противном случае - нет.
Равно
!= Не равно
> Больше
< Меньше
>= Больше или равно
<= Меньше или равно
#include <iostream>
using namespace stdi
int main ()
int а, Ь, С;
а = 2;
Ь З;
cout « "\п";
cout « "\п";
return О;
а меньше Ь
Переменная с содержит 1.
Значение снеотрицательно.
ЦИКЛfоr
Мы можем организовать повторяющееся выполнение одной и той же после
дователыюсти инструкций с помощью специальной конструкции, именуемой
ЦUКЛОМ. В С++ предусмотрены различные ВИДЫ циклов, и одним из них являетея
цикл for. Для тех, кто уже не новичок в программировании, отмечу, что в С+ +
цикл for работает так же, как в языках С# или Java. Рассмотрим простейший
формат использования цикла for.
fоr(инициализация; условие; инкременr) инструкция;
внимание на то, что все эти элементы цикла for должны отделяться точкой с
запятой. Цикл for б~/:tет выполняться до тех пор, пока вычисление элемента
+
условие дает истинный результат. Как только это условное выражение ста
нет ложным, цикл завершится, а выполнение программы продолжится с ин
u+
25.
m
струкции, следующей за циклом for. О
1:
()
Использование цикла for демонстрируется в следующей программе. Она вы О
водит на экран числа от 1 до 100.
iinclude <iostream>
using hamespace std;
int main ()
{
int count:
return О;
count=count+1,
или подобной ей, поскольку в С++ существует специальный оператор инкре
мента, который выполняет операцию увеличения значения на единицу более эф
фективно. Оператор инкремента обозначается в виде двух знаков "плюс" (+ +).
Например, инструкцию for из приведенной выше программы с использованием
оператора "++" можно переписать так.
Одним из ключевых элементов С++ является бло" "ода. Блок - это логически
связанная группа программных инструкций (т.е. одна или несколько инс-rрук
ций), которые обрабатываются как единое целое. В С++ программный блок соз
дается путем размещения последоватеЛЬНОСТIf инструкций между фигурными
(открывающей и закрывающей) скобками, После создания блок кода становится
логической единицей, которую разрешено использовать везде, где можно приме
нять одну инструкцию. Например, блок кода может составлять тело инструкций
if или for. Рассмотрим такую инструкцию if'.
i f (w < h) {
v w * h;
w = О;
#include <iostream>
using namespace stdi
int main ()
double result, n, di
« "\n".i
result = n I di
cout « n « " I " « d « " Р".О " « resulti
}
return О;
Введите делимое: 10
Введите делитель: 2
Значение d не равно О, деление осуществимо.
10 / 2 равно 5
В этом случае инструкция i f управляет целым блоком кода, а не просто одной
ИliструкциеЙ. Если управляющее условие инструкции if истинно (как в нашем
примере), будут выполнены все три инструкции, составляющие блок. Поnробуй-
58 rлава 1. Основы С++
те ввести нулевое значение для делителя и узнайте, как выполнится наша про
грамма в этом случае. Убедитесь,.что IIpИ вводе нуля if-блок будет опущен.
как будет показано ниже, блоки кода имеют дополнительные свойства и спо
собы IIpименения. Но основная цель их существования - создавать логически
связанные единицы кода.
у = y+l:
cout « х « " " « у;
Верно ли это? •
Проект 1.2.
Последовательность действий
1. Создайте новый файл с именем Fto~Table. срр.
2. Введите 8 этот файл CJlед)'ющую программу.
/*
Проект 1.2.
iinclude <iostrearn>
using narnespace std;
int rnain () {
double f; // содержит длину, выраженную в футах
double т; // содержит результат преобразования в метры
int counter; // счетчик строк
+
u+
1i
ID
return О; О
1:
U
О
3. Обратите внимание на то, как используется переменная counter для вы
вода пустой строки после каждых десяти строк. Сначала (до входа в цикл
for) она устанавливается равной нулю. После каждого пре06разования
переменная counter инкРементируется. Когда ее значение становится
равным t О, выводится пустая строка, после чего счетчик ~ТPOK снова обну
ляется и процесс повторяется.
'ШОI
:1111 []ablSlIId" а ф~ЫКI ~ldSl;l
Любая С++-программа составляется из "строительных блоков", именуемых
функциями. И хотя более детально мы будем рассматривать функции в MOДY:le 5,
сделаем здесь краткий обзор понятий и терминов, связанных с этой темой. Функ
ция - это подпрограмма, которая содержит одну или несколько С++-инструк
ций и выполняет одну или несколько задач.
Каждая функция имеет имя, которое используется для ее вызова. Чтобы вы
звать функцию, достаточно в исходном коде l1porpaмMbl указать ее имя с парой
круглых скобок. Своим функциям программист может давать любые имена, за
исключением имени mаiл (), зарезервированного для функции, с которой начи
нается выполнение программы. Например, мы назвали функцию именем МуРи
лс. Тогда для вызова функции MyFunc достаточно записать следующее.
МуFuлс();
#include <iostream>
#include <cstdlib>
using namespace std;
int main ()
64 Глава 1. Основы С++
int result;
cout « result;
return О;
Библиотеки С++
как упоминалось выше, функция аЬs () не является частью языка С++. но ее
"знает" каждый С++-компилятор. Эта функция, как и множестводругих, входит
в состав стандартной 6u6лuотeICU. В примерах этой книги мы подробно рассмо
трим использование многих библиотечных функций С++.
С++: руководство для начинающих 65
u+
встречающихся задач, включая операции ввода-вывода, математические вы
ВАЖНОI
"'1 КАючевь'е САОва С++
В стандарте С++ определено 63 ключевых слова. Они показаны в табл. 1.1.
Эти ключевые слова (в сочетании с синтаксисом операторов и разделителей)
образуют определение языка С++. В ранних версиях С++ определено ключевое
слово overload, но теперь оно устарело. Следует иметь в виду, что в С++ раз
личается строчное и прописное написание букв. Ключевые слова не являются ис
ключением, Т.е. все они должны быть написаны строчными буквами.
• Идентификаторы
в С++ идентификатор представляет собой имя, которое присваивается функ
ции, переменной или иному элементу, 'определенному пользователем. 'Иденти
фикаторы могут состоять из одного или нескольких символов. Имена перемен
ных должны начинаться с буквы или символа подчеркивания. Последующим
символом может быть буква, цифра и символ подчеркивания. Символ подчер
кивания можно использовать для улучшения читабельноети имени перемеююй,
IJ;lIlример line_count. В С++ прописные и строчные буквы воспринимаются
t-.:ш, различные символы, Т.е. myvar И MyVar - это разные имена. В С++ нельзя
использовать в качестве идентификаторов ключевые слова, а также имена стан
дартных функций (например, abs). Запрещено также использовать в качестве
пользовательских имен встроенные идентификаторы (например, cout).
Вот несколько примеров допустимых идентификаторов.
Test х у2 Maxlncr
ир _top my_var simplelnterest23
Помните, что идентификатор не должен начинаться с цифры. Так, 980К
недопустимый идентификатор. Конечно, вы вольны называть переменные и
другие программные элементы по своему усмотрению, но обычно идентифика
тор отражает назначение или смысловую характеристику элемента, которому
он принадлежит.
С++: PYI<OBOACTBO ДЛЯ начинающих 67
3. Слова
катор?
..
index21 и Index21 представляют собой один и тот же идентифи
А. count
В. count
С. count27
D_ 67count
Е. if
1. Ключевым словом эдесь является вариант (от. В С++ все ключевые слова ПШlIутся
С ИСПОЛЪЗ0ванием СТРОЧНЫХ букв.
2. С++-идентификатор может содержать буквы, цифры И символ подчеркивания.
З. Нет, в С++ прописные и строчные буквы воспринимаются как раэличные симвоJIы.
68 Глава 1. Основы С++
14. Год Юпитера (т.е. время, за которое Юпитер делает один полный оборот
вокруг СОЛf!.ца) составляет приблизительно 12 земных лет. Напишит(' [IPO-
грамму, которая бы выполняла преобразовани.я значений, выраженных в
годах Юпитера, в значения, выраженные в годах Земли. Конечно же, здесь
допустимо использование нецелых ЗliачениЙ.
ные. Вы научитесь создавать такие типы данных, как классы, структуры и перс
числения, 110 при этом помните, что все (даже очень сложные) новые типы дан
ных состоят из встроенных.
С++: РУI<ОВОДСТВО ДNI начинающих 71
Тип Название
char Символьный
wchar t Символьный двубайтовый
int целочисленный
float С плавающей ТОЧКОЙ
double С плавающей точкой двойной точности
bool Лоrnческий (или булев)
void Без значения
В С++ перед такими типами данных, как char, int и double, разрешается
использовать .модифU1Шmоры. Модификатор служит для изменения значения ба
зовоro типа, чтобы он более точно соответствовал конкретной ситуации. Пере
чиелим возможные модификаторы типов.
signed
unsigned
long
short
Модификаторы signed, unsigned, long и short можно примеitять к це
лочисленным базовым типам. Кроме того, модификаторы signed и unsigned
можно использовать с типом
char, а модификатор long - с типом double. Все
допустимые комбинации базовых типов и модификаторов приведены в табл. 2.1.
В этой таблице также указаны гарантированные минимальные диапазоны пред
ставления для каждоro типа, соответствующие С++-стандарту ANSI/ISO.
Минимальные диапазоны, представленные в табл. 2.1, важно понимать именно
как .мUНUМШlЫtыe дuanаЭ()7fЫ и никак иначе. Дело в том, что С++-компилятор может
расширить один или несколько из этих минимумов (что и делается в большинстве
случаев). Это означает, что диапазоны представления С++-типов данных зависят от
конкретной реализации. Например, ДЛЯ компьютеров, которые используют арифме
тику дополнительных кодов (т.е. почти все COBpeMeННhle компьютеры), целочислен
НЫЙ тип будет иметь диапазоli представлеlШЯ чисел от -32 768 до 32 767. Однако во
всех случаях диапазон представления типа short int является подмножеством
диапазона типа in t, диапазон представления KOТOPOro в свою очередь является под
множеством диапазона типа long int. Аналогичными отношениями связаны и
типы float, double и long double. В этом контексте термин noдмножеC11l8O озна
чает более УЗЮiЙ или такой же диапазон. Таким образом, типы int и long int
MOryт иметь одинаковые диапазоны, но диапазон типа int не может быть шире диа
пазона типа long int.
72 Модуль 2. Типы данных и операторы
~Ти~п~____________________~~~и~н~и~м~ал~ЬН~Ыf1~АИ~а_п
__о_эо_н
________________
char -128-127
unsigned char 0-255
signed char -128-127
int -32768-32767
unsigned int 0-65 535
signed int АналоrиЧентипу int
short int -32768-32767
unsigned short int 0-65 535
signed short int Аналоrnчентилу short int
10ng int -2147483648-2147483647
·signed 10ng int Аналоrnчен типу 10ng int
unsigned 10ng int 0-4294967295
floa t 1Е-37 -1 Е +37. с шестью значащими цифрами
double 1Е-37-1Е+З7. (" дссятьюзначащими цифрами
_1_0_п-=g__d_о_u_Ь_1_е______________1_Е_-_3_7_-_1_Е_+_37--'-,с десятью значащими циФрами
Целочисленный тип
как вы узнали в модуле 1, переменные типа iI\ t предназначены для хранения lJ,e-
лочисленных значений, которые не содержат др06ной части. Переменные этого nma
часто используются для управления циклами и условными инструкциями. Опера
ЦИИ с iпt-значениями (поскольку они не имеют дробной части) выполняются на
много быстрее, чем со значениями с плавающей точкой (вещественного типа).
А теперь подробно рассмотрим каждый тип в отдельности.
Поскольку целочисленный тип столь важен для программирования, в С++
определено несколько его разJfовидностеЙ. Как показано в табл. 2.1, существуют
короткие (short int), обычные (int) и длинные (long int) целочисленные
значения. Кроме того, существуют их версии со знаком и без. Переменные uело
численного типа со знаком MOryт содержать как положительные, так и отрица-
С++: PYI(OBOACTBO для начинающих 73
*/
int main ()
{
short int i; // короткое iпt-значение со знаком
short unsigned int j; // короткое iпt-значение без знака
return О;
-5536 60000
Дело в том, что битовая комбинация, которая представляет число 60000 как короткое
(short) целочисленное значение без знака, интерпретируется в качестве короткого
iпt-значения со знаком как число -5536 (при 16-разрядном представлении).
С++: РУКОВОДСТВО ДЛЯ начинающих 75
Символы
Переменные типа char предназначены для хранения ASCIl-СИМDОЛОВ (напри
мер А, z или G) либо иных В-разрядных величин. Чтобы задать символ, необхо
димо заключить ero в одинарные кавычки. Например, после выполнения следу-
I
char ch;
ch = 'х' i
tinclude <iostream>
76 МОДУЛЬ 2. Типы данных и операторы
int main ()
{
char letter; // Перекеква_ letter ~a char
// иcnоnьзуетса дn_ упрaanекия цихпок for.
J.
for(letter = 'А'; letter <= 'Z'; letter++)
cout « letter;
return О;
Если ЦИКЛ for вам покажется несколько cTpaнным. то учтите. что символ' А'
представляется в компьютере как число 65. а значения от 'А' до 'Z' являются
последовательными и расположены в возрастающем порядке. При каждом про
ходе через ЦИКЛ значение переменной let ter инкрементируется. Таким обра
зом. после первой итерации переменная lette:r будет содержать значение I Е'.
ТИП wchar_ t предназначен для хранения символов. входящих в состав t:юль
ших символьных наборов. Вероятно. вам известно, что в некоторых естественных
языках (например китайском) определено очень большое количество символов,
для которых В-разрядное представление (обеспечиваемое типом char) вес[.ма
недостаточно. Для решения проблем такого рода в язык С++ и был добавлен тип
wchar _ t. который вам пригодится. если вы планируете выходить со своими про
граммами на международный рынок.
3. Да, переменные типа char можно ИСПОЛЬЗОЕ·атъ для представления небольmиx це
лыхчисел.
С++: РУКОВОДСТВО ДЛЯ начинающих 77
..................................................................................................................................
/*
Здесь используется теорема Пифагора для вычисления
длины гипотенузы по заданным длинам двух других
сторон треугольника.
*/
78 МОДУЛЬ 2. Типы данных и операторы
.................................................................................................................................
finclude <iostream>
#include <cmath> // Это~ saroловох аеобходим дn_
/ / 8101S08. ФУRJC.ЦИИ 8qrt () .
using namespace std;
int main () (
double х, у, z;
х = 5;
У 4;