- •Р. Лафоре
- •Глава 1. Общие сведения 32
- •Глава 3. Циклы и ветвления 92
- •Глава 4. Структуры 142
- •Глава 5. Функции 168
- •Глава 6. Объекты и классы 217
- •Глава 7. Массивы и строки 261
- •Глава 8. Перегрузка операций 312
- •Глава 9. Наследование 361
- •Глава 10. Указатели 411
- •Глава 11. Виртуальные функции 476
- •Глава 12. Потоки и файлы 536
- •Глава 13. Многофайловые программы 596
- •Глава 14. Шаблоны и исключения 640
- •Глава 15. Стандартная библиотека шаблонов (stl) 681
- •Глава 16. Разработка объектно-ориентированного по 752
- •Глава 1 «Общие сведения» включает список тем, касающихся uml, с указа- нием их расположения в книге.
- •Глава 1
- •Глава 2
- •Глава 3
- •If внутри циклов
- •If и else во вложенных ветвлениях
- •Глава 4
- •Глава 5 Функции
- •Глава 6
- •Глава 7
- •123456. Россия
- •123456. Россия
- •Глава 8
- •Глава 9
- •Глава 10 Указатели
- •Main() передает адрес переменной var в ptrd в centimize()
- •Centimize() использует этот адрес для доступа к var
- •Глава 11
- •Глава 12
- •Тип:менеджер Фамилия: Александров Номер:1111
- •Тип:Ученый Фамилия: Лебедев Номер:2222
- •Тип:рабочий Фамилия:Шевелев Номер:3333
- •Глава 13
- •Глава 14
- •Много объектов разных классов в памяти Рис. 14.2. Шаблон класса
- •Алгоритмы используют итераторы для работы с объектами контейнеров. Рис. 15.1. Контейнеры, алгоритмы и итераторы
- •Глава 16
- •Глава 1
- •Глава 2
- •Глава 3
- •Глава 4
- •Глава 5
- •Глава 6
- •Глава 7
- •Глава 8
- •Глава 9
- •Глава 10 Ответы на вопросы
- •Глава 11
- •Глава 12 Ответы на вопросы
- •Глава 13 Ответы на вопросы
- •Глава 14 Ответы на вопросы
- •Глава 15 Ответы на вопросы
- •Глава 16
Общие сведения
Зачем нужно
объектно-ориентированное программирование
Характеристики
объектно-ориентированных языков
С++
и С
Изучение
основ
Универсальный
язык моделирования (UML)
Изучив эту книгу,
вы получите основные навыки создания
программ на языке
С++,
поддерживающем
объектно-ориентированное программирование
(ООП).
Для
чего нужно ООП? Каковы преимущества
ООП перед такими традиционны-
ми
языками программирования, как Pascal,
C или BASIC?
Что является
основой
ООП?
В ООП существует две ключевые концепции
—
объекты
и
классы.
Каков
смысл этих двух терминов? Как
связаны между собой языки C и C++?
Эта глава посвящена рассмотрению
перечисленных вопросов, а также
обзору
средств языка, о которых
пойдет речь в других главах книги. Не
беспокойтесь,
если материал, изложенный
в этой главе, покажется вам чересчур
абстрактным.
Все методы и концепции,
которые мы упомянем, будут подробно
рассмотрены
в последующих главах
книги.
Для чего нужно
объектно-
ориентированное
программирование?
Развитие объектно-ориентированного
метода обусловлено ограниченностью
дру-
гих методов программирования,
разработанных ранее. Чтобы лучше понять
и оце-
нить значение ООП, необходимо
разобраться, в чем состоит эта
ограниченность
и каким образом она
проявляется в традиционных языках
программирования.
Процедурные
языки
С,
Pascal,
FORTRAN
и другие сходные
с ними языки программирования отно-
сятся
к категории
процедурных языков.
Каждый оператор такого языка являетсяГлава 1
указанием компьютеру
совершить некоторое действие, например
принять дан-
ные от
пользователя, произвести с ними
определенные действия и вывести
ре-
зультат этих действий на экран.
Программы, написанные на процедурных
язы-
ках, представляют собой
последовательности инструкций.
Для небольших
программ не требуется дополнительной
внутренней органи-
зации (часто
называемой термином
парадигма).
Программист создает перечень
инструкций,
а компьютер выполняет действия,
соответствующие этим инструк-
циям.
Деление на
функции
Когда размер
программы велик, список команд становится
слишком громозд-
ким. Очень небольшое
число программистов способно удерживать
в голове
более 500 строк программного
кода, если этот код не разделен на более
мелкие
логические части.
Функция
является средством, облегчающим
восприятие при
чтении текста программы
(термин
функция
употребляется в языках C и C++;
в
других языках программирования это же
понятие называют подпрограммой
или
процедурой).
Программа, построенная на основе
процедурного метода, раз-
делена на
функции, каждая из которых в идеальном
случае выполняет некото-
рую
законченную последовательность действий
и имеет явно выраженные связи
с
другими функциями программы.
Можно развить идею
разбиения программы на функции, объединив
несколь-
ко функций в
модуль
(зачастую
модуль представляет собой отдельный
файл).
При
этом сохраняется процедурный принцип:
программа делится на несколько
компонентов,
каждый из которых представляет собой
набор инструкций.
Деление программы на функции и модули
является основой структурного
программирования.
Структурное программирование представляет
собой нечто
не вполне определенное,
однако в течение нескольких десятков
лет, пока не бы-
ла разработана
концепция объектно-ориентированного
программирования, оно
оставалось
важным способом организации программ.
Недостатки
структурного программирования
В непрекращающемся процессе роста и
усложнения программ стали
постепенно
выявляться недостатки
структурного подхода к программированию.
Возможно,
вам приходилось слышать
«страшные истории» о том, как происходит
работа
над программным проектом,
или даже самим участвовать в создании
такого про-
екта: задача оказывается
сложнее, чем казалось, сроки сдачи
проекта переносят-
ся. Все новые и
новые программисты привлекаются для
работы, что резко увели-
чивает
расходы. Окончание работы вновь
переносится, и в результате проект
терпит
крах.
Проанализировав причины столь печальной
судьбы многих проектов, можно
прийти
к выводу о недостаточной мощи структурного
программирования: как
бы эффективно
ни применялся структурный подход, он
не позволяет в доста-
точной степени
упростить большие сложные программы.
В чем же недостаток процедурно-ориентированных
языков? Существует две
основные
проблемы. Первая заключается в
неограниченности доступа функций
к
глобальным данным. Вторая состоит в
том, что разделение данных и
функций,
являющееся основой
структурного подхода, плохо отображает
картину реально-
го мира.
Давайте рассмотрим эти недостатки на
примере программы складского учета.
В
такой программе глобальными данными
являются записи в учетной книге.
Различные
функции будут получать доступ к этим
данным для выполнения
операций
создания новой записи, вывода записи
на экран, изменения сущест-
вующей
записи и т. д.
Неконтролируемый
доступ к данным
В процедурной
программе, написанной, к примеру, на
языке C, существует два
типа данных.
Локальные данные
находятся внутри функции и предназначены
для
использования исключительно этой
функцией. Например, в программе
склад-
ского учета функция,
осуществляющая вывод записи на экран,
может использо-
вать локальные данные
для хранения информации о выводимой
записи. Локаль-
ные данные функции
недоступны никому, кроме самой функции,
и не могут
быть изменены другими
функциями.
Если существует
необходимость совместного использования
одних и тех же
данных несколькими
функциями, то данные должны быть
объявлены как
гло-
бальные.
Это, как правило, касается тех данных
программы, которые являются
наиболее
важными. Примером здесь может служить
уже упомянутая учетная
книга. Любая
функция имеет доступ к глобальным
данным (мы
не рассматрива-
ем случай группирования
функций в модули).
Схема, иллюстрирующая концеп-
цию
локальных и глобальных данных, приведена
на рис. 1.1.
Большие программы обычно содержат
множество функций и глобальных
пе-
ременных. Проблема процедурного
подхода заключается в том, что число
воз-
можных связей между глобальными
переменными и функциями может быть
очень
велико, как показано на рис. 1.2.
Рис.
1.1.
Глобальные и локальные переменные
Рис. 1.2. Процедурный
подход
Большое число
связей между функциями и данными, в
свою очередь, также
порождает
несколько проблем. Во-первых, усложняется
структура програм-
мы. Во-вторых, в
программу становится трудно вносить
изменения. Изменение
структуры
глобальных данных может потребовать
переписывания всех функ-
ций,
работающих с этими данными. Например,
если разработчик программы
складского
учета решит сделать код продукта не
5-значным, а 12-значным, то
будет
необходимо изменить соответствующий
тип данных с short
на long.
Это
означает,
что во все функции, оперирующие кодом
продукта, должны быть вне-
сены
изменения, позволяющие обрабатывать
данные типа Long.
Можно
привести
аналогичный бытовой пример,
когда в супермаркете изменяется
расположение
отделов, и покупателям
приходится соответствующим образом
менять свой при-
вычный путь от одного
отдела к другому.
Когда изменения вносятся в глобальные
данные больших программ, бывает
непросто
быстро определить, какие функции
необходимо скорректировать. Да-
же
в том случае, когда это удается сделать,
из-за многочисленных связей между
функциями
и данными исправленные функции начинают
некорректно работать
с другими
глобальными данными. Таким образом,
любое изменение влечет за
собой
далеко идущие последствия.
Моделирование
реального мира
Вторая, более
важная, проблема процедурного подхода
заключается в том, что
отделение
данных от функций оказывается
малопригодным для отображения
картины
реального мира. В реальном мире нам
приходится иметь дело с физиче-
скими
объектами, такими, например, как люди
или машины. Эти объекты нельзя
отнести
ни к данным, ни к функциям, поскольку
реальные вещи представляют
собой
совокупность
свойств
и
поведения.
Свойства
Примерами свойств
(иногда
называемых характеристиками)
для людей могут
являться цвет глаз
или место работы; для машин — мощность
двигателя и коли-
чество дверей.
Таким образом, свойства объектов
равносильны данным в про-
граммах:
они имеют определенное значение,
например
голубой
для цвета глаз
или
4
для количества дверей автомобиля.
Поведение
Поведение — это некоторая реакция
объекта в ответ на внешнее
воздействие.
Например, ваш босс в
ответ на просьбу о повышении может дать
ответ «да» или
«нет». Если вы
нажмете на тормоз автомобиля, это
повлечет за собой его оста-
новку.
Ответ и остановка являются примерами
поведения. Поведение сходно с
функцией:
вы вызываете функцию, чтобы совершить
какое-либо действие (на-
пример,
вывести на экран учетную запись),
и функция совершает это действие.
Таким образом, ни отдельно взятые
данные, ни отдельно взятые функции
не
способны адекватно отобразить
объекты реального мира.
Объектно-ориентированный
подход
Основополагающей
идеей объектно-ориентированного подхода
является объ-
единение
данных
и
действий, производимых над этими
данными,
в единое целое,
которое называется
объектом.
Функции объекта,
называемые в C++
методами
или
функциями-членами,
обычно
предназначены для доступа к данным
объекта. Если необходимо счи-
тать
какие-либо данные объекта, нужно вызвать
соответствующий метод, кото-
рый
выполнит считывание и возвратит
требуемое значение. Прямой доступ
к
данным невозможен. Данные сокрыты
от внешнего воздействия, что защищает
их
от случайного изменения. Говорят, что
данные и методы
инкапсулированы.
Термины
сокрытие
и
инкапсуляция
данных являются ключевыми в
описании
объектно-ориентированных
языков.
Если необходимо изменить данные объекта,
то, очевидно, это действие также
будет
возложено на методы объекта. Никакие
другие функции не могут изме-
нять
данные класса. Такой подход облегчает
написание, отладку и использова-
ние
программы.
Типичная программа
на языке C++
состоит из совокупности объектов,
взаи-
модействующих между собой
посредством вызова методов друг друга.
Структу-
ра программы на C++
приводится на рис. 1.3.
Объект
Рис.
1.3.
Объектно-ориентированный подход
Аналогия
Возможно, вы
представляете себе объекты чем-то вроде
отделов компании —
бухгалтерии,
продаж, кадров и т. п. Деление на отделы
является важной частью
структурной
организации фирмы. В большинстве
компаний (за
исключением
небольших)
в обязанности отдельного сотрудника
не входит решение одновре-
менно
кадровых, торговых и учетно-бухгалтерских
вопросов. Обязанности четко
распределяются
между подразделениями, и у каждого
подразделения имеются
данные, с
которыми оно работает: у бухгалтерии
— заработная плата, у отдела
продаж
— сведения, касающиеся торговли, у
отдела кадров — персональная ин-
формация
о сотрудниках и т. д.
Сотрудники каждого
отдела производят операции только с
теми данными,
которые относятся к
данному отделу. Подобное разделение
обязанностей позво-
ляет легче
следить за деятельностью компании и
контролировать ее, а также
поддерживать
целостность информационного пространства
компании. Напри-
мер, бухгалтерия
несет ответственность за информацию,
касающуюся зарплат.
Если у менеджера
по продажам возникнет необходимость
узнать суммарный
оклад сотрудников
компании за июль, то ему не нужно будет
идти в бухгалте-
рию и рыться в
картотеках; ему достаточно послать
запрос компетентному лицу,
которое
должно найти нужную информацию,
обработать ее и выслать ответ на
запрос.
Такая схема позволяет обеспечить
правильную обработку данных, а так-
же
ее защиту от возможного воздействия
посторонних лиц. Подобная структура
компании
изображена на рис. 1.4. Подобным же образом
объекты создают такую
организацию
программы, которая обеспечивает
целостность ее данных.
Отдел продаж
Рис.
1.4.
Корпоративный подход
ООП: подход к
организации программы
Объектно-ориентированное
программирование никак не связано с
процессом вы-
полнения программы, а
является лишь способом ее организации.
Большая часть
операторов C++
идентична операторам процедурных
языков, в частности языка С.
Внешне
метод класса в C++
очень похож на обычную функцию языка
C, и толь-
ко по контексту программы
можно определить, является ли функция
частью
процедурной С-программы или
объектно-ориентированной программы
на C++.
Характеристики
объектно-ориентированных языков
Здесь мы рассмотрим
несколько основных элементов, входящих
в состав объект-
но-ориентированных
языков, в частности в состав языка C++.
Объекты
Когда вы подходите к решению задачи с
помощью объектно-ориентированного
метода,
то вместо проблемы разбиения задачи
на функции вы сталкиваетесь с
проблемой
разбиения ее на объекты. Мышление в
терминах объектов оказывает-
ся
гораздо более простым и наглядным, чем
в терминах функций, поскольку про-
граммные
объекты схожи с объектами реального
мира. Более подробно данный
вопрос
рассмотрен в главе 16 «Разработка
объектно-ориентированного программ-
ного
обеспечения».
Что должно представляться в программе
в виде объектов? Окончательный
ответ
на этот вопрос может дать только ваше
воображение, однако приведем не-
сколько
советов, которые могут оказаться
полезными:
Физические объекты.
Автомобили при моделировании уличного
движения.
Схемные элементы при моделировании
цепи электрического тока.
Страны при создании экономической
модели.
Самолеты при моделировании диспетчерской
системы.
Элементы интерфейса.
Окна.
Меню.
Графические объекты
(линии,
прямоугольники, круги).
Мышь, клавиатура, дисковые устройства,
принтеры.
Структуры данных.
Массивы.
Стеки.
Связанные списки.
Бинарные деревья.
Группы людей.
Сотрудники.
Студенты.
Покупатели.
Продавцы.
Хранилища данных.
Описи инвентаря.
Списки сотрудников.
Словари.
Географические координаты городов
мира.
Пользовательские типы данных.
Время.
Величины углов.
Комплексные числа.
Точки на плоскости.
Участники компьютерных игр.
Автомобили в гонках.
Позиции в настольных
играх (шашки,
шахматы).
Животные в играх, связанных с живой
природой.
Друзья и враги в приключенческих играх.
Соответствие между
программными и реальными объектами
является след-
ствием объединения
данных и функций. Получающиеся в
результате такого
объединения
объекты в свое время произвели фурор,
ведь ни одна программная
модель,
созданная на основе процедурного
подхода, не отражала существующие
вещи
столь точно, как это удалось сделать с
помощью объектов.
Классы
Когда мы говорим
об объектах, мы говорим, что они являются
экземплярами
классов.
Что это означает? Рассмотрим следующую
аналогию. Практически все
компьютерные
языки имеют стандартные типы данных;
например, в C++
есть це-
лый тип int.
Мы можем
определять переменные таких типов в
наших программах:
int
day;
int
count;
int
divisor;
int
answer;
Подобным же образом мы можем определять
объекты класса, как показано
на рис.
1.5. Класс является своего рода формой,
определяющей, какие данные
и функции будут
включены в объект класса. При объявлении
класса не созда-
ются никакие объекты
этого класса, по аналогии с тем, что
существование типа
int
еще не означает
существование переменных этого типа.
Объекты этого
класса
Object1 Object2 Object3
Таким образом,
класс является описанием совокупности
сходных между со-
бой объектов. Это
соответствует нестрогому в техническом
смысле пониманию
термина «класс»:
например, Prince,
Sting
и Madonna
относятся к
классу рок-
музыкантов. Не существует
конкретного человека с именем
«рок-музыкант»,
однако люди со своими
уникальными именами являются объектами
этого класса,
если они обладают
определенным набором характеристик.
Объект класса часто
также называют
экземпляром
класса.
Наследование
Понятие класса
приводит нас к понятию
наследования.
В повседневной жизни
мы часто
сталкиваемся с разбиением классов на
подклассы: например, класс
жи-
вотные
можно разбить на подклассы
млекопитающие, земноводные, насекомые,
птицы
и
т. д. Класс
наземный транспорт
делится на классы
автомобили, грузови-
ки, автобусы,
мотоциклы
и т. д.
Рис.
1.5.
Класс и его объекты
Принцип, положенный в основу такого
деления, заключается в том, что каж-
дый
подкласс обладает свойствами, присущими
тому классу, из которого выде-
лен
данный подкласс. Автомобили, грузовики,
автобусы и мотоциклы обладают
колесами
и мотором, являющимися характеристиками
наземного транспорта.
Кроме тех
свойств, которые являются общими у
данных класса и подкласса,
подкласс
может обладать и собственными свойствами:
например, автобусы име-
ют большое
число посадочных мест для пассажиров,
в то время как грузовики
обладают
значительным пространством и мощностью
для перевозки тяжеловес-
ных грузов
и т. д. Иллюстрация этой идеи приведена
на рис. 1.6.
Подобно этому, в
программировании класс также может
породить множест-
во подклассов. В
C++
класс, который порождает все остальные
классы, называ-
ется
базовым классом,
остальные классы наследуют его свойства,
одновременно
обладая собственными
свойствами. Такие классы называются
производными.
Не проводите ложных аналогий между
отношениями «объект—класс» и «ба-
зовый
класс — производный класс»! Объекты,
существующие в памяти компью-
тера,
являются воплощением свойств, присущих
классу, к которому они принад-
лежат.
Производные классы имеют свойства как
унаследованные от базового
класса,
так и свои собственные.
Наследование можно считать аналогом
использования функций в процедур-
ном
подходе. Если мы обнаружим несколько
функций, совершающих похожие
действия,
то мы извлечем из них идентичные части
и вынесем их в отдельную
функцию.
Тогда исходные функции будут одинаковым
образом вызывать свою
общую часть,
и в то же время в каждой из них будут
содержаться свои собст-
венные
инструкции. Базовый класс содержит
элементы, общие для группы про-
Базовый класс
Производные
классы
Рис.
1.6.
Наследование
изводных классов. Роль наследования в
ООП такая же, как и у функций в про-
цедурном
программировании, — сократить размер
кода и упростить связи между
элементами
программы.
Повторное
использование кода
Разработанный
класс может быть использован в других
программах. Это свойст-
во называется
возможностью
повторного использования кода.
Аналогичным свой-
ством в процедурном
программировании обладают библиотеки
функций, кото-
рые можно включать в
различные программные проекты.
В ООП концепция наследования открывает
новые возможности повторного
использования
кода. Программист может взять существующий
класс, и, ничего
не изменяя, добавить
в него свои элементы. Все производные
классы унаследу-
ют эти изменения,
и в то же время каждый из производных
классов можно мо-
дифицировать
отдельно.
Предположим, что
вы (или
кто-то другой)
разработали класс, представля-
ющий
систему меню, аналогичную графическому
интерфейсу Microsoft
Windows
или
другому графическому интерфейсу
пользователя (GUI).
Вы не хотите
из-
менять этот класс, но вам необходимо
добавить возможность установки и
сня-
тия флажков. В этом случае вы
создаете новый класс, наследующий все
свойст-
ва исходного класса, и
добавляете в него необходимый код.
Легкость повторного использования
кода уже написанных программ
является
важным достоинством ООП.
Многие компании утверждают, что
возможность
включать в новые версии
программного обеспечения коды программ
более ста-
рых версий благоприятно
сказывается на прибыли, приносимой
последними.
Более подробно этот
вопрос будет обсуждаться в других
главах книги.
Пользовательские
типы данных
Одним из достоинств
объектов является то, что они дают
пользователю возмож-
ность создавать
свои собственные типы данных. Представьте
себе, что вам необ-
ходимо работать
с объектами, имеющими две координаты,
например x и y. Вам
хотелось бы совершать
обычные арифметические операции над
такими объекта-
ми, например:
position1
=
position2
+
origin
где переменные
position1,
position2
и origin
представляют
собой наборы из двух
координат.
Описав класс, включающий в себя пару
координат, и объявив объек-
ты этого
класса с именами position1,
position2
и origin,
мы фактически
создадим
новый тип данных. В C++
имеются средства, облегчающие создание
подобных
пользовательских типов
данных.
Полиморфизм и
перегрузка
Обратите внимание
на то, что операции присваивания =
и сложения +
для типа
position
должны выполнять
действия, отличающиеся от тех, которые
они выпол-
няют для объектов
стандартных типов, например int.
Объекты position1
и прочие
не
являются стандартными, поскольку
определены пользователем как
принадле-
жащие классу position.
Как же операторы
=
и +
распознают, какие действия необ-
ходимо
совершить над операндами? Ответ на этот
вопрос заключается в том, что
мы сами
можем задать эти действия, сделав нужные
операторы методами класса
position.
Использование
операций и функций различным образом
в зависимости от
того, с какими типами
величин они работают, называется
полиморфизмом.
Когда
существующая операция, например
=
или +,
наделяется возможностью совер-
шать
действия над операндами нового типа,
говорят, что такая операция являет-
ся
перегруженной.
Перегрузка представляет собой частный
случай полиморфиз-
ма и является
важным инструментом ООП.
С++
и С
С++
унаследовал возможности языка C. Строго
говоря, C++
является расшире-
нием языка С: любая
конструкция на языке C является корректной
в C++;
в то
же время обратное неверно.
Наиболее значительные нововведения,
присутст-
вующие в C++,
касаются классов, объектов и ООП
(первоначальное
название
языка C++
— «С с классами»).
Тем не менее имеются и другие
усовершенствова-
ния, связанные со
способами организации ввода/вывода
и написанием коммен-
тариев. Иллюстрация
отношения между языками C и C++
приведена на рис. 1.7.
На практике
существует гораздо больше различий
между C и C++,
чем мо-
жет показаться вначале.
Несмотря на то что можно писать программы
на C++,
внешне
напоминающие программы на C, вряд ли
кому-то придет в голову так
поступать.
Программисты, использующие C++,
не только пользуются преиму-
ществами
этого языка перед C, но и по-новому
используют возможности, уна-
следованные
от C. Если вы знакомы с C, значит, у вас
уже имеются некоторые
Рис.
1.7.
Отношения между C и C++
знания относительно
C++,
но все же вероятно, что значительная
часть материа-
ла окажется для вас
новой.
Изучение основ
Наша задача состоит
в том, чтобы как можно быстрее научить
вас создавать объ-
ектно-ориентированные
программы. Поскольку, как мы уже говорили,
значи-
тельная часть языка C++
унаследована от C, то даже при
объектно-ориентиро-
ванной струкtype
программы ее основу составляют
«старомодные» процедурные
средства.
Поэтому в главах 2-5 рассматриваются
традиционные средства про-
граммирования
языка C++,
в основном унаследованные от С,
действия с пере-
менными и ввод/вывод,
организация циклов и переходов, работа
с функциями.
Там же будут рассмотрены
структуры, синтаксис которых совпадает
с синтакси-
сом классов.
Если вы уже знакомы
с языком C, то у вас, возможно, возникнет
желание
пропустить эти главы. Тем
не менее, не стоит забывать о различиях
между C и
С++,
которые могут как лежать на поверхности,
так и быть незаметными при
невнимательном
чтении. Поэтому мы советуем читателю
бегло просматривать
тот материал,
который ему известен, а основное внимание
сконцентрировать на
различиях C и
C++.
Детальное рассмотрение ООП начнется
в главе 6 «Объекты и классы».
Все
примеры, начиная с этой главы, будут
иметь объектно-ориентированную
структуру.
Универсальный
язык моделирования (UML)
UML
можно условно
называть графическим языком,
предназначенным для мо-
делирования
компьютерных программ. Под моделированием
понимается созда-
ние наглядной
визуальной интерпретации чего-либо.
UML
позволяет
создавать
подобную интерпретацию
программ высокоуровневой организации.
Родоначальниками
UML
стали три
независимых языка моделирования,
соз-
дателями которых были соответственно
Гради Буч, Джеймс Рэмбо и Ивар Дже-
кобсон.
В конце 90-х годов они объединили свои
разработки, в результате чего
получили
продукт под названием
универсальный язык моделирования
(UML),
ко-
торый был одобрен OMG
— консорциумом
компаний, определяющих промыш-
ленные
стандарты.
Почему UML
необходим?
Во-первых, потому, что бывает трудно
установить
взаимоотношение частей
большой программы между собой посредством
анали-
за ее кода. Как мы уже видели,
объектно-ориентированное
программирование
является более
прогрессивным, чем процедурное. Но даже
при этом подходе
для того, чтобы
разобраться в действиях программы,
необходимо как минимум
представлять
себе содержание ее кода.
Проблема изучения
кода состоит в том, что он очень
детализован. Гораздо
проще было бы
взглянуть на его общую структуру,
отображающую только ос-
новные части
программы и их взаимодействие. UML
обеспечивает
такую воз-
можность.
Наиболее важным
средством UML
является набор
различных видов диа-
грамм. Диаграммы
классов иллюстрируют отношения между
различными клас-
сами, диаграммы
объектов — между отдельными объектами,
диаграммы связей
отражают связь
объектов во времени и т. д. Все эти
диаграммы, по сути, отража-
ют взгляды
на программу и ее действия с различных
точек зрения.
Кроме иллюстрирования
структуры программы, UML
имеет немало
других
полезных возможностей. В
главе 16 пойдет речь о том, как с помощью
UML
разработать
первоначальную структуру программы.
Фактически UML
можно
использовать
на всех этапах создания проекта — от
разработки до документиро-
вания,
тестирования и поддержки.
Тем не менее не
стоит рассматривать UML
как средство
разработки про-
граммного обеспечения.
UML
является лишь
средством для иллюстрирования
разрабатываемого
проекта. Несмотря на возможность
применения к любому типу
языков, UML
наиболее полезен
в объектно-ориентированном программировании.
Как мы уже упомянули
во введении, мы будем постепенно
рассматривать
новые средства UML
по ходу изложения
основного материала книги.
Глава 1: введение
в UML.
Глава 8: диаграммы классов, ассоциации,
возможности перемещения.
Глава 9: обобщение, агрегация, композиция
классов.
Глава 10: диаграмма состояний и
множественности.
Глава 11: диаграммы объектов.
Глава 13: более сложные диаграммы
состояний.
Глава 14: шаблоны, зависимости и
стереотипы.
Глава 16: варианты использования,
диаграммы вариантов использования,
диаграммы
действий и диаграммы последовательностей.
Резюме
ООП является способом организации
программы. Основное внимание при
его
изучении уделяется организации
программы, а не вопросам написания
кода.
Главным компонентом
объектно-ориентированной программы
является объект,
содержащий данные
и функции для их обработки. Класс
является формой или
образцом для
множества сходных между собой объектов.
Механизм наследования позволяет
создавать новые классы на основе
суще-
ствующих классов, не внося
изменений в последние. Порожденный
класс насле-
дует все данные и методы
своего родителя, но имеет также и свои
собственные.
Наследование делает
возможным повторное использование
кода, то есть вклю-
чение однажды
созданного класса в любые другие
программы.
С++
является расширением языка C, позволяющим
реализовать концепцию
ООП, а также
включающим в себя некоторые дополнительные
возможности.
Часть средств языка C,
несмотря на их поддержку C++,
признаны устаревшими
в контексте
новых подходов к программированию и
потому употребляются ред-
ко, как
правило, заменяясь более новыми
средствами C++.
В результате разли-
чия между C и C++
оказываются более значительными, чем
кажется на первый
взгляд.
Универсальный язык
моделирования (UML)
является
стандартизованным
средством
визуализации структуры и функционирования
программы посред-
ством диаграмм.
Идеи, обсуждавшиеся
в этой главе, будут конкретизироваться
по мере изуче-
ния C++.
Возможно, в процессе чтения других глав
книги вы ощутите необхо-
димость
вернуться к материалу, изложенному в
этой главе.
Вопросы
Ответы на приведенные ниже вопросы
можно найти в приложении Ж. Вопросы
с
альтернативными вариантами ответов
могут иметь несколько верных ответов.
Языки Pascal,
BASIC
и C являются языками,
в то время как
С++
является языком.
В качестве образца по отношению к
объекту выступает:
а) метод;
б) класс;
в) операция;
г) значение.
Двумя основными компонентами объекта
являются и функ-
ции, которые .
В C++
функцию, входящую в состав класса,
называют:
а) функция-член
класса;
б) оператор
класса;
в) функция
класса;
г) метод
класса.
Защита данных от несанкционированного
доступа другими функциями
называется .
Какие из перечисленных ниже причин
являются главными для использо-
вания
объектно-ориентированных языков?
а) возможность
создания собственных типов данных;
б) простота
операторов объектно-ориентированных
языков по сравнению
с процедурными
языками;
в) наличие
средств для автокоррекции ошибок в
объектно-ориентирован-
ных языках;
г) объектно-ориентированные
программы легче концептуализируются.
__________
отображают объекты реального мира
точнее, чем функции.
Истинно ли
утверждение: программа на C++
в целом схожа с программой
на C за
исключением незначительных различий
в кодировании.
Объединение данных и функций называется .
Если язык обеспечивает возможность
создания пользовательских типов
данных,
то говорят, что язык называется:
а) наследуемым;
б) инкапсулируемым;
в) перегруженным;
г) расширяемым.
Верно или неверно
утверждение: двух операторов достаточно,
чтобы лег-
ко отличить программу
на C++
от программы на С.
Возможность
выполнения оператором или функцией
различных действий
в зависимости
от типа операндов называется .
Операция, выполняющая заданные действия
над пользовательским типом
данных,
называется:
а) полиморфической;
б) инкапсулированной;
в) классифицированной;
г) перегруженной.
Запоминание новых
терминов языка C++:
а) является
очень важным;
б) можно
отложить «на потом»;
в) служит
ключом к успеху и процветанию;
г) бессмысленно.
Универсальный язык моделирования —
это:
а) программа
для построения физических моделей;
б) средство
визуализации организации программы;
в) результат
объединения языков C++
и FORTRAN;
г) вспомогательное
средство при разработке программного
обеспечения.
