- •Содержание
- •ВВЕДЕНИЕ
- •1.ОБЪЕКТНО-ОРИЕНТИРОВАННЫЙ ПОДХОД
- •2. ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ
- •2.1. Абстрактные типы данных
- •2.2. Базовые принципы объектно-ориентированного программирования
- •2.3. Основные достоинства языка С++
- •2.4. Особенности языка С++
- •2.4.1. Ключевые слова
- •2.4.2. Константы и переменные
- •2.4.3. Операции
- •2.4.4. Типы данных
- •2.4.5. Передача аргументов функции по умолчанию
- •2.5.1. Объект cin
- •2.5.2. Объект cout
- •2.5.3. Манипуляторы
- •3.1. Объекты
- •3.2. Понятие класса
- •3.3. Конструктор копирования
- •3.4. Конструктор explicit
- •3.5. Указатель this
- •3.6. Встроенные функции (спецификатор inline)
- •3.7. Организация внешнего доступа к локальным компонентам класса (спецификатор friend)
- •3.8. Вложенные классы
- •3.9. Static-члены (данные) класса
- •3.10. Компоненты-функции static и const
- •3.11. Proxi-классы
- •3.12. Ссылки
- •3.12.1. Параметры ссылки
- •3.12.2. Независимые ссылки
- •3.13. Пространства имен
- •3.13.3. Ключевое слово using как объявление
- •3.13.4. Псевдоним пространства имен
- •3.14. Практические приемы ограничения числа объектов класса
- •4. НАСЛЕДОВАНИЕ
- •4.1.1. Конструкторы и деструкторы при наследовании
- •4.2. Виртуальные функции
- •4.3. Абстрактные классы
- •4.4. Виртуальные деструкторы
- •4.6. Виртуальное наследование
- •5.2. Перегрузка операторов
- •5.2.2. Перегрузка унарного оператора
- •5.2.3. Дружественная функция operator
- •5.2.4. Особенности перегрузки операции =
- •5.2.5. Перегрузка оператора []
- •5.2.6. Перегрузка оператора ()
- •5.2.7. Перегрузка оператора ->
- •5.2.8. Перегрузка операторов new и delete
- •5.3. Преобразование типа
- •5.3.1. Явные преобразования типов
- •6. ШАБЛОНЫ
- •6.1. Параметризированные классы
- •6.2. Передача в шаблон класса дополнительных параметров
- •6.3. Шаблоны функций
- •6.4. Совместное использование шаблонов и наследования
- •6.5. Шаблоны класса и friend-функции
- •6.6. Некоторые примеры использования шаблона класса
- •6.6.1. Реализация smart-указателя
- •6.6.2. Задание значений параметров класса по умолчанию
- •7.2. Состояние потока
- •7.3. Строковые потоки
- •7.4. Организация работы с файлами
- •7.5. Организация файла последовательного доступа
- •7.6. Создание файла произвольного доступа
- •7.7. Основные функции классов ios, istream, ostream
- •8. ИСКЛЮЧЕНИЯ В С++
- •8.2. Перенаправление исключительных ситуаций
- •8.3. Исключительная ситуация, генерируемая оператором new
- •8.6. Спецификации исключительных ситуаций
- •8.7. Задание собственного неожиданного обработчика
- •9. СТАНДАРТНАЯ БИБЛИОТЕКА ШАБЛОНОВ (STL)
- •9.3. Категории итераторов
- •9.4. Операции с итераторами
- •9.5. Контейнеры последовательностей
- •9.5.2. Контейнер последовательностей list
- •9.5.3. Контейнер последовательностей deque
- •9.6. Ассоциативные контейнеры
- •9.6.1. Ассоциативный контейнер multiset
- •9.6.2. Ассоциативный контейнер set
- •9.6.3. Ассоциативный контейнер multimap
- •9.7.1. Адаптер stack
- •9.7.2. Адаптер queue
- •9.7.3. Адаптер priority_queue
- •9.8. Алгоритмы
- •9.8.1. Алгоритмы сортировки sort, partial_sort, sort_heap
- •9.8.2. Алгоритмы поиска find, find_if, find_end, binary_search
- •9.8.3. Алгоритмы fill, fill_n, generate и generate_n
- •9.8.4. Алгоритмы equal, mismatch и lexicographical_compare
- •9.8.6. Алгоритмы работы с множествами
- •9.8.7. Алгоритмы swap, iter_swap и swap_ranges
- •9.8.8. Алгоритмы copy, copy_backward, merge, unique и reverse
- •10. ПРИМЕРЫ РЕАЛИЗАЦИИ КОНТЕЙНЕРНЫХ КЛАССОВ
- •10.1. Связанные списки
- •10.1.1. Реализация односвязного списка
- •10.2. Реализация бинарного дерева
- •11. ПРОГРАММИРОВАНИЕ ДЛЯ WINDOWS
- •11.1. Система, управляемая сообщениями
- •11.2. Управление графическим выводом
- •11.3. Контекст устройства
- •11.3.1. Экран
- •11.3.2. Принтер
- •11.3.3. Объект в памяти
- •11.3.4. Информационный контекст
- •11.4. Архитектура, управляемая событиями
- •11.5. Исходный текст программы
- •11.7. Некоторые новые типы данных
- •11.8. Венгерская нотация
- •11.9. Точка входа программы
- •11.11. Создание окна
- •11.12. Цикл обработки сообщений
- •11.13. Оконная процедура
- •11.14. Обработка сообщений
- •11.15. Обработка сообщений функцией DefWindowProc
- •11.16. Синхронные и асинхронные сообщения
- •11.17. Еще один метод получения описателя контекста устройства
- •11.19. Полосы прокрутки
- •Литература
|
|
|
|
Ю. А. Луцик, В. Н. Комличенко |
Р |
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
И |
|
|
|
|
|
|
|
|
|
У |
|
|
|
|
|
|
|
|
|
Г |
|
|
|
|
|
|
|
|
|
|
Б |
|
|
|
|
|
|
ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ |
|||||||
|
|
ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ С++ |
||||||||
|
|
|
|
|
|
|
а |
|
|
|
|
|
|
|
Допущено Министерством образования |
|
|||||
|
|
|
Республики Беларусь в честве учебного пособия |
|||||||
|
|
|
|
|
|
е |
|
|
|
|
|
|
для студентов учр жд ний, обеспечивающих получение |
||||||||
|
|
|
|
|
т |
|
|
|
|
|
|
высшего образования по сп кциальностям «Информационные системы |
|||||||||
|
|
|
|
|
и хнологии (по направлениям)» |
|
|
|||
|
|
|
|
о |
|
|
|
|
|
|
|
|
|
и |
|
|
|
|
|
|
|
|
|
л |
|
|
|
|
|
|
|
|
|
б |
|
|
|
|
|
|
|
|
|
и |
|
|
|
|
|
|
|
|
|
|
Б |
|
|
|
|
|
|
|
|
|
|
МИНСК БГУИР 2008
УДК 681.322 (075.8) ББК 32.97 я 73
Л 86
Рецензенты :
|
|
|
|
|
|
|
|
|
Р |
|
|
кафедра прикладной математики и информатики Белорусского |
|||||||||
|
государственного педагогического университета им. М. Танка |
|||||||||
|
|
|
|
|
|
|
|
И |
||
|
(заведующий кафедрой, канд. физ.-мат. наук А. А. Бейда), |
|
||||||||
|
заведующий кафедрой «Программное обеспечение вычислительной |
|||||||||
|
|
|
|
|
|
|
У |
|
||
|
техники и автоматизированных систем» Белорусского национального |
|||||||||
|
технического университета, канд. техн. наук Н. А. Разоренов |
|||||||||
|
|
|
|
|
|
Г |
|
|
||
|
|
|
|
|
|
Б |
|
|
|
|
|
|
|
|
|
а |
|
|
|
||
|
|
|
|
к |
|
|
|
|
||
|
|
|
ро |
е |
|
|
|
|
|
|
|
Луцик, Ю. А. |
|
|
|
|
|
|
|||
Л 86 |
ваннте программирование на языке С++: учеб. по- |
|||||||||
Объектно-ориент |
||||||||||
|
|
л |
|
|
|
|
|
|
|
|
|
собие / Ю. А. Луц к, В. Н. Комличенко. – Минск : БГУИР, 2008. – 266 с.: ил. |
|||||||||
|
ISBN 978-985-444-985-8 |
|
|
|
|
|
|
|||
|
б |
|
|
|
|
|
|
|
||
|
В уче ном пособиирассмотрены приемы и правила объектно-ориентированного |
|||||||||
|
программирования с испо ьзованием языка С++. Изложены основные конструкции язы- |
|||||||||
|
и |
|
|
|
|
|
|
|
|
|
|
ка С++, а также о щие принципы разработки объектно-ориентированных программ. Рас- |
|||||||||
|
смотрена разра отка программ для Windows с использованием WIN32 API. |
|
||||||||
|
Б |
|
|
|
|
|
|
|
|
|
|
Пособ е будет полезно студентам всех специальностей, магистрантам и аспирантам. |
|||||||||
|
|
|
|
|
|
|
УДК 681.322 (075.8) |
|||
|
|
|
|
|
|
|
ББК 32.97 я 73 |
|||
ISBN 978-985-444-985-8 |
|
|
|
© Луцик Ю. А., Комличенко В. Н., |
||||||
2008 |
|
|
|
© УО «Белорусский государственный |
||||||
|
|
|
|
|||||||
|
|
|
|
|
университет информатики |
|
||||
|
|
|
|
|
и радиоэлектроники», 2008 |
|
||||
2 |
|
|
|
|
|
|
|
|
|
ВВЕДЕНИЕ
Одна из важнейших задач программирования – разработка алгоритма. Имеется два основных подхода к разработке программ. Первый из них называ- ется процедурным программированием. Для создания программ на его основе
необходимо следующее: |
|
|
|
|
|
|||
- определить задачу, которую нужно решить; |
|
Р |
||||||
- продумать интерфейс программы с пользователем; |
||||||||
|
||||||||
- разбить программу на логически законченные этапы; |
|
|||||||
- |
создать текст программы; |
|
И |
|||||
|
|
|
||||||
- |
отладить программу; |
|
|
|
|
|||
- |
тестировать программу. |
|
|
|
||||
Второй подход называется объектно-ориентированным программирова- |
||||||||
|
|
|
|
|
Г |
|
|
|
нием (ООП). Для разработки программ, основанных на использовании объект- |
||||||||
|
|
|
|
|
Б |
|
|
|
но-ориентированного программирования, необходимоУ: |
|
|||||||
- |
определить задачу; |
|
|
|
|
|
||
- определить уникальные объекты в области решаемой задачи; |
||||||||
- определить взаимосвязь между объектами; |
|
|
||||||
- |
|
|
|
к |
|
|
|
|
создать классы объектов, определяя переменные, представляющие все- |
||||||||
возможные состояния, в которых может н ходиться объект; |
|
|||||||
- |
|
|
е |
|
|
|
||
определить сообщ ния, принимаемые каждым объектом, и коды функ- |
||||||||
|
|
кт |
буд т реагировать на эти сообщения. Оформить |
|||||
ций, согласно которым объ |
|
|||||||
их как функции-члены неко орых классов; |
|
|
|
|||||
- |
|
ро |
|
|
|
|
|
|
объявить объек ы данных классов; |
|
|
|
|||||
- определить начальное состояние системы; |
|
|
||||||
- |
скомп л вать, скомпоновать систему. |
|
|
|||||
|
л |
|
|
|
|
|
|
|
Цель настоящего учебного пособия помочь в изучении языка С++, под- |
держивающего объектно-ориентированный подход в программировании. Для |
||
|
б |
|
успешного освоенияизлагаемого материала необходимо знание основных кон- |
||
струк |
языка С. |
|
ций |
||
Б |
|
Материал пособия основывается на ряде изданий [1–11]. |
|
|
3
1.ОБЪЕКТНО-ОРИЕНТИРОВАННЫЙ ПОДХОД
Объектно-ориентированное программирование – это методология про-
граммирования, основанная на представлении программы в виде совокупности
взаимодействующих друг с другом объектов, каждый из которых является эк-
нии трех требований: 1) в качестве базовых элементов используются объектыР, а
земпляром определенного класса, а классы могут образовывать иерархию на-
следования. Программа будет объектно-ориентированной только при соблюде-
ного класса; 3) классы организованы иерархически. И
не алгоритмы; 2) каждый объект является экземпляром какого-либо определен- У
Объектно-ориентированное проектирование. Программирование преж-
де всего подразумевает правильное и эффективное использование механизмов
конкретных языков программирования, а проектирование основное внимание |
|||||||
уделяет правильному и эффективному |
структурированиюГсложных систем. |
||||||
|
|
|
|
|
|
|
а |
Объектно-ориентированное проектирование – это методология проектирования, |
|||||||
соединяющая в себе процесс объектной декомпозицииБи приемы представления |
|||||||
|
|
|
|
|
к |
||
логической (классы и объекты) и физичес ой (модули и процессы) структуры |
|||||||
|
|
|
|
|
ес |
|
|
системы, а также статической и динамич |
ой моделей проектируемой систе- |
||||||
мы. |
|
|
|
|
|
|
|
Именно объектно-ориентированная д композиция отличает объектно- |
|||||||
ориентированное проектирование |
с руктурного; в первом случае логическая |
||||||
|
|
|
нно |
|
|
|
|
структура системы отражается абс ракциями в виде классов и объектов, во вто- |
|||||||
ром – алгоритмами. |
и |
отый анализ. На объектную модель повлияла |
|||||
Объектно-ориентир ва |
|||||||
|
лиз |
|
го цикла программного обеспечения. Объектно- |
||||
более ранняя модель жизне |
|||||||
ориентированный ана |
з направлен на создание моделей реальной действи- |
||||||
б |
|
|
|
|
|
|
|
тельности на основе объектно-ориентированного мировоззрения. Объектно- |
|||||||
и |
|
– это методология, при которой требования к системе |
|||||
ориентированный ана |
воспринимаются с точки зрения классов и объектов, выявленных в предметной областиБ.
На результатах анализа формируются модели, на которых основывается проектирование, которое в свою очередь создает фундамент для окончательной реализации системы с использованием методологии программирования.
2.ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ
2.1.Абстрактные типы данных
Концепция абстрактных типов и абстрактных типов данных является ключевой в программировании. Абстракция подразумевает разделение и неза- 4
висимое рассмотрение интерфейса и реализации.
Интерфейс и внутренняя реализация являются определяющими свойст-
вами объектов окружающего нас мира. Интерфейс – это средство взаимодейст- вия с некоторым объектом. Реализация – это внутреннее свойство объекта. Наибольший интерес представляет эффективность реализации.
Модульность и абстракция дополняют друг друга. Модульность предполагает скрытие деталей реализации, а абстракция позволяет специфи- цировать каждый модуль перед тем, как будет написана соответствующая
объект (его реализацию) пользователем, который не является специалистом в |
|
этой области, приводит к отрицательному результатуГ. В программировании за- |
|
прет таких действий поддерживается мех низмом запрета доступа или скры- |
|
тия внутренних компонент. Принцип бстрБкции обязывает использовать меха- |
|
|
к |
низмы скрытия, которые предотвр щ ют умышленное или случайное измене- |
|
ние внутренней реализации. |
а |
Различают процедурную абстра цию и абстракцию данных. |
|
Процедурная абс ракция тр бует раздельного рассмотрения назначения |
|
процедуры (например функцииеС/С++) и ее реализации. |
|
Абстракция данных |
ребует раздельного рассмотрения операций над |
программа. |
|
Предположим, мы покупаем некоторый достаточно сложный бытовой |
прибора мы редко задумываемся о физических процессах, происходящихР в дан- ном объекте, т.е. его реализации. Чем совершеннее интерфейс объекта, тем он
прибор, имеющий развитый интерфейс с пользователем. При эксплуатации
удобнее в эксплуатации. При приобретении объекта нас Иинтересует его интер- фейс, но не его реализация. Основная цель абстракции в программировании за-
ключается в отделении интерфейса от реализации. ПопыткаУусовершенствовать
озациитэ их операций. Достаточно знать, какие операции
данными и реали выполняет модуль (функция С/С++), но не требуется знать, какие данные он
при этом испо ьзует (они скрыты) и как в действительности выполняются эти операции.
Таким образом, абстракция позволяет отделить внешнее представление
няя структура модуля, а лишь то, что этот модуль может «делать». С точки Бзрен я же разработчика, качество модуля определяется его дешевизной и
модуля от его внутренней структуры. Пользователя не интересует внутрен- |
|
|
л |
б |
|
и |
|
эффект вностью.
Абстракция данных предполагает определение и рассмотрение абстракт- ных типов данных (АТД), или, иначе, новых типов данных, введенных пользо- вателем. АТД – это совокупность данных вместе с множеством операций, ко- торые можно выполнять над этими данными.
2.2. Базовые принципы объектно-ориентированного программирования
Объектно-ориентированное программирование основывается на трех ос- 5
новных концепциях: инкапсуляции, полиморфизме и наследовании.
Инкапсуляция (пакетирование) представляет собой механизм, связываю- щий вместе данные и код, обрабатывающий эти данные, и сохраняющий их от внешнего воздействия и ошибочного использования. Инкапсуляция позволяет создавать объект, являющийся логическим целым, включающим данные и код для работы с этими данными. Объект обеспечивает защиту против случайной или несанкционированной модификации частных (private) составляющих его членов. Закрытые данные или коды (методы) доступны только для других час- тей этого объекта и недоступны вне его. Открытая часть объекта предназначена для обеспечения контролируемого интерфейса его закрытой части.
Полиморфизм обеспечивает возможность реагировать различным образом
на одно и то же сообщение (вызов функции-члена). Полиморфизм позволяет |
||
уменьшить сложность программы посредством использования одного иРтого же |
||
|
У |
|
интерфейса для задания целого класса действий. Поддержка полиморфизма в |
||
ООП осуществляется через виртуальные функции и механизм перегрузкиИи пе- |
||
реопределения. |
|
|
Ключевым в понимании полиморфизма является то, что он позволяет ма- |
||
нипулировать объектами различной степени сложности путемГсоздания общего |
||
|
асс |
|
для них стандартного интерфейса для реализации похожих действий. |
||
Наследование представляет собой мех низм, благодаряБ |
которому новый |
|
|
к |
|
(производный) класс может создаваться, наследуя (приобретая) свойства от уже |
||
существующего (базового) класса. Новый л , и пользуя наследование, нуж- |
дается только в определении специфичных толь о для этого класса компонент. |
|
Наследование позволяет поддержива конц пцию иерархии классов. |
|
Различают полиморфные и мономорфныее |
языки. Для мономорфных |
языков характерно то, что ис ьзуемые функции, процедуры и операторы |
ть имеют уникальный тип. П поллим рфные языки поддерживают концепцию поли-
морфизма в теории т пов, к гда дно и то же имя может быть использовано для выражения различныхлдейств й. Поддержка полиморфизма осуществляется че- рез виртуальные функц , механизм перегрузки функций и операторов.
Передачабсоо щенийвыражает основную методологию построения объ- ектно-ориентированных программ. Программы представляются в виде набора объектов передачи сообщений между ними.
БПри построении объектно-ориентированной программы одним из основ- ных является вопрос иерархии классов. Пусть имеется некоторая иерархия (структура, взаимосвязь) классов. В этом случае можно:
- определить объект для заданного класса; - построить новый класс, наследуя свойства существующего класса;
- изменить поведение нового класса (изменить существующие и доба- вить новые функции).
Построение нового класса, наследованного из существующего, предпола-
гает:
- добавление в новый класс новых компонент-данных;
6
-добавление в новый класс новых компонент-функций;
-замену в новом классе наследуемых из старого класса компонент- функций.
Наследование может быть одиночным и множественным (рис. 1). При множественном наследовании производный (новый) класс имеет более одного наследуемого (старого) класса, из которых образуется новый класс. При этом новый класс наследует поведение этих классов.
Общий базовый класс |
|
|||
Производный |
Производный |
Производный |
||
базовый класс |
базовый класс |
Р |
||
базовый класс |
||||
|
|
|
|
И |
Производный Производный |
|
|
ПроизводныйУ |
|
Простое (одиночное) наследование |
|
Г |
|
|
|
Множественное наследование |
|||
Рис. 1. Виды иер рхии классов |
|
|||
|
|
Б |
|
|
Таким образом, объектно-ориентиров нное программирование – метод |
||||
|
а |
|
|
|
построения программ в виде множ ства взаимодействующих объектов, струк- |
||||
к |
|
|
|
|
е |
|
|
|
библиотеки класс в. Библиотека может рассматриваться как заданная базовая иерархическаяиструктура. Для разрабатываемой программы из библиотеки мо-
тура и поведение которых описаны соответствующими классами. Все эти клас-
сы образуют иерархию классов, выражающую отношение наследования.
При разработкеобъек но-ориентированных программ часто используются
жет быть лвыбрана некоторая подструктура и затем расширена новыми классами с использованием пр нципов наследования.
бЯзык программирования называется объектно-ориентированным, если : и- он поддерживает абстрактные типы данных (объекты с определенным нтерфейсом и скрытым внутренним состоянием);
Б - объекты имеют связанные с ними типы (классы); - поддерживается механизм наследования.
Программа будет объектно-ориентированной только при соблюдении всех трех указанных требований. В частности, программирование, не основанное на иерархических отношениях, не относится к OOП, а называется программирова-
нием на основе абстрактных типов данных.
2.3. Основные достоинства языка С++
Язык С++ основывается на языке С, сохраняя большую часть возможно-
7