Объектно-ориентированное программирование на С++
Покупка
Основная коллекция
Тематика:
Программирование на C и C++
Издательство:
Сибирский федеральный университет
Авторы:
Баранова Ирина Владимировна, Баранов Сергей Николаевич, Баженова Ирина Васильевна, Кучунова Елена Владимировна, Толкач Светлана Геннадьевна
Год издания: 2019
Кол-во страниц: 288
Дополнительно
Вид издания:
Учебник
Уровень образования:
ВО - Бакалавриат
ISBN: 978-5-7638-4034-6
Артикул: 766145.01.99
Рассмотрены основные концепции объектно-ориентированного, обобщенного и событийного программирования. В качестве языка программирования выбран язык C++. Подробно изложены принципы и механизмы работы с классами и объектами, в том числе наследование, перегрузка функций и операций, виртуальные функции, шаблоны функций и классов. Большое внимание уделено работе со стандартной библиотекой шаблонов, раздельной компиляции программ и применению компонентного и событийного подходов в разработке программных приложений. Предназначено для студентов бакалавриата, обучающихся по направлениям подготовки 01.03.01 «Математика» и 01.03.02 «Прикладная математика и информатика».
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 01.03.01: Математика
- 01.03.02: Прикладная математика и информатика
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
Министерство науки и высшего образования Российской Федерации Сибирский федеральный университет ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ НА С++ Допущено учебно-методическим советом Сибирского федерального университета в качестве учебника для студентов, обучающихся по направлениям подготовки бакалавров 01.03.01 «Математика» и 01.03.02 «Прикладная математика и информатика». Протокол № 2 от 12.10.2018 Красноярск СФУ 2019
УДК 004.438(07) ББК 32.973.22я73 О-294 Авторы: И. В. Баранова, С. Н. Баранов, И. В. Баженова Е. В. Кучунова, С. Г. Толкач Р е ц е н з е н т ы: Л. Ф. Ноженкова, д-р техн. наук, профессор, зав. отделом прикладной информатики Института вычислительного моделирования СО РАН; Е. Н. Бельская, канд. техн. наук, доцент Сибирского государственного университета науки и технологий имени академика М. Ф. Решетнева О-294 Объектно-ориентированное программирование на С++ : учебник / И. В. Баранова, С. Н. Баранов, И. В. Баженова [и др.]. – Красноярск : Сиб. федер. ун-т, 2019. – 288 с. ISBN 978-5-7638-4034-6 Рассмотрены основные концепции объектно-ориентированного, обобщенного и событийного программирования. В качестве языка программирования выбран язык С++. Подробно изложены принципы и механизмы работы с классами и объектами, в том числе наследование, перегрузка функций и операций, виртуальные функции, шаблоны функций и классов. Большое внимание уделено работе со стандартной библиотекой шаблонов, раздельной компиляции программ и применению компонентного и событийного подходов в разработке программных приложений. Предназначено для студентов бакалавриата, обучающихся по направлениям подготовки 01.03.01 «Математика» и 01.03.02 «Прикладная математика и информатика». Электронный вариант издания см.: УДК 004.438(07) http://catalog.sfu-kras.ru ББК 32.973.22я73 ISBN 978-5-7638-4034-6 © Сибирский федеральный университет, 2019
ОГЛАВЛЕНИЕ Предисловие ................................................................................................................6 1. Основные понятия и принципы объектно-ориентированного подхода ......8 1.1. Основные понятия объектно-ориентированного программирования ..............8 1.2. Основные принципы объектно-ориентированного программирования ..........9 1.3. Преимущества и недостатки объектно-ориентированного подхода к программированию ..........................................................................................11 1.4. Объектно-ориентированные языки программирования ..................................13 1.5. Структура ООП-программы и парадигмы программирования, связанные с объектно-ориентированным подходом ........................................15 Контрольные вопросы ...............................................................................................17 2. Работа с классами и объектами .........................................................................18 2.1. Описание класса ..................................................................................................18 2.1.1. Спецификаторы доступа ..........................................................................18 2.1.2. Методы класса ...........................................................................................19 2.1.3. Конструкторы ............................................................................................22 2.1.4. Деструктор .................................................................................................25 2.2. Указатель this ...................................................................................................28 2.3. Константные объекты и методы класса ............................................................29 2.4. Статические члены класса .................................................................................32 2.5. Дружественные функции ...................................................................................37 Контрольные вопросы ...............................................................................................43 3. Методика и реализация принципа наследования классов ..........................45 3.1. Базовый и производный классы. Синтаксис объявления наследуемых классов ..........................................................................................45 3.2. Спецификаторы доступа при наследовании .....................................................47 3.3. Конструкторы и деструкторы производных классов .......................................50 3.4. Перекрытие методов при наследовании ...........................................................54 3.5. Примеры иерархии классов при одиночном наследовании ............................56 3.6. Множественное наследование ...........................................................................68 Контрольные вопросы ...............................................................................................75 Задания для самостоятельного выполнения ............................................................76 4. Механизм полиморфизма. Перегрузка функций и операций ......................77 4.1. Основные сведения о перегрузке функций и операций ..................................77 4.1.1. Перегрузка функций .................................................................................77 4.1.2. Перегрузка операций ................................................................................80 4.2. Способы перегрузки операторных функций ....................................................82
Оглавление 4.2.1. Перегрузка с помощью функций-членов класса ....................................83 4.2.2. Перегрузка с помощью глобальных функций ........................................85 4.2.3. Сравнение функций-членов и глобальных функций .............................87 4.3. Примеры перегружаемых операций ..................................................................88 4.3.1. Операции инкремента и декремента .......................................................89 4.3.2. Операции ввода/вывода ............................................................................90 4.3.3. Операция преобразования типов .............................................................93 4.3.4. Другие операции .......................................................................................95 Контрольные вопросы ...............................................................................................98 Задания для самостоятельного выполнения ............................................................98 5. Раннее и позднее связывание. Виртуальные функции ................................99 5.1. Механизм раннего связывания ..........................................................................99 5.2. Вспомогательные поля типа.............................................................................104 5.3. Виртуальные функции ......................................................................................106 5.4. Абстрактные классы .........................................................................................108 5.5. Механизмы позднего связывания ....................................................................117 Контрольные вопросы .............................................................................................118 Задания для самостоятельного выполнения ..........................................................119 6. Шаблоны классов и функций ..........................................................................120 6.1. Понятие шаблонов ............................................................................................120 6.2. Шаблоны функций ............................................................................................121 6.2.1. Понятие шаблона функции ....................................................................122 6.2.2. Правила работы с шаблонами функций................................................127 6.2.3. Специализация шаблонов функций ......................................................134 6.2.4. Перегрузка шаблонов функций .............................................................136 6.3. Шаблоны классов ..............................................................................................139 6.3.1. Понятие шаблона класса ........................................................................139 6.3.2. Правила описания шаблонов классов ...................................................144 6.3.3. Внешнее описание методов шаблонов классов ...................................146 6.3.4. Шаблоны как параметры шаблона класса ............................................149 6.3.5. Специализация шаблонов классов ........................................................150 Контрольные вопросы .............................................................................................152 Задания для самостоятельного выполнения ..........................................................153 7. Библиотека шаблонов .......................................................................................154 7.1. Сведения о стандартной библиотеке шаблонов .............................................154 7.2. Итераторы ..........................................................................................................156 7.3. Алгоритмы .........................................................................................................161 7.3.1. Категории алгоритмов ............................................................................161 7.3.2. Функции-предикаты ...............................................................................164 7.4. Функциональные объекты................................................................................180
Оглавление 7.4.1. Стандартные функциональные объекты ...............................................180 7.4.2. Адаптеры функций и функциональных объектов ...............................186 7.5. Последовательные контейнеры .......................................................................192 7.5.1. Основные сведения о последовательных контейнерах .......................192 7.5.2. Контейнер vector .................................................................................195 7.5.3. Контейнер list......................................................................................210 7.5.4. Контейнер deque ...................................................................................214 7.5.5. Адаптер stack .......................................................................................216 7.5.6. Адаптер queue .......................................................................................218 7.5.7. Адаптер priority_queue .................................................................220 7.6. Ассоциативные контейнеры .............................................................................223 7.6.1. Общие свойства ассоциативных контейнеров .....................................224 7.6.2. Множество ...............................................................................................226 7.6.3. Множество с дубликатами .....................................................................228 7.6.4. Пары или тип pair ................................................................................232 7.6.5. Словарь ....................................................................................................232 7.6.6. Словарь с дубликатами ключей .............................................................238 Контрольные вопросы .............................................................................................243 Задания для самостоятельного выполнения ..........................................................244 8. Пользовательские библиотеки. Многофайловые проекты .......................245 8.1. Понятие пользовательской библиотеки ..........................................................245 8.2. Многофайловые проекты .................................................................................246 8.3. Директивы pragma ..........................................................................................249 8.4. Разделение интерфейса класса и его реализации ..........................................251 8.5. Пространства имен ...........................................................................................256 8.6. Создание проекта библиотеки динамической компоновки DLL ..................258 Контрольные вопросы .............................................................................................263 Задания для самостоятельного выполнения ..........................................................263 9. Компонентно-ориентированный и событийный подходы к разработке программных приложений ..........................................................264 9.1. Основные понятия компонентного и событийного программирования ................................................................264 9.2. Визуальное событийное программирование ..................................................270 9.3. Создание проекта «Форма Windows Forms» ..................................................274 Контрольные вопросы .............................................................................................280 Задания для самостоятельного выполнения ..........................................................280 Послесловие ...........................................................................................................282 Рекомендательный библиографический список..............................................283 Использованная литература ................................................................................285
ПРЕДИСЛОВИЕ Целью написания данного учебника является систематизация и изложение основных концепций и механизмов объектно-ориентированного, обобщенного, компонентно-ориентированного и событийного программирования. Изучение учебника позволит студентам сформировать практические навыки разработки программных приложений, создания программ на языке высокого уровня, а также применения изученных инструментов и технологий для решения прикладных задач моделирования и обработки данных. В качестве языка программирования выбран язык С++, являющийся одним из наиболее распространенных и востребованных языков программирования. Учебник знакомит не только с понятиями, принципами и методологией вышеперечисленных парадигм программирования, но и особенностями их реализации в языке C++. Изучение основ объектно-ориентированного подхода и связанных с ним обобщенного, компонентного и событийного программирования требует предварительного освоения значительного объема теоретических знаний по конструкциям и операторам языка С++, принципам структурного программирования и алгоритмам работы с массивами, указателями, строками, структурами, файлами и динамическими структурами данных. Также предполагается достаточная квалификация в области разработки программных приложений. Поэтому учебник рекомендуется использовать не для первоначального, а продолжающего этапа обучения программированию. Данный учебник состоит из девяти глав. В первой главе рассматриваются основные понятия и принципы объектно-ориентированного программирования (ООП), преимущества и недостатки объектно-ориентированного подхода, понятие объектно-ориентированного языка (ООЯ) программирования и требования, предъявляемые к подобным языкам. Описывается структура объектно-ориентированной программы. Во второй главе подробно излагаются основы работы с классами и объектами, в том числе синтаксис описания класса, спецификаторы доступа к членам класса, конструкторы, деструкторы и пр. В третьей главе рассматривается один из важнейших принципов объектно-ориентированного подхода – наследование классов. Демонстрируется синтаксис объявления наследуемых классов для ситуации одиночного и множественного наследования, управление правами доступа класса-наследника к данным родительского класса. Также дается описание правил наследования и перекрытия методов в наследуемых классах.
Предисловие Четвертая глава учебника посвящена описанию механизма перегрузки функций и операций. Приводятся основные сведения о синтаксисе, способах реализации и особенностях данного механизма. В пятой главе рассматривается один из важнейших инструментов современных языков программирования – виртуальные функции, позволяющие успешно решать задачи, в которых для родственных классов (из одной иерархии) выполняются сходные, но не одинаковые действия. В шестой главе представлены шаблоны функций и классов – средства языка программирования, предназначенные для создания обобщенных алгоритмов, не зависящих от используемых в них типов данных. Шаблоны относятся к обобщенному программированию. Седьмая глава учебника посвящена обзору стандартной библиотеки шаблонов – инструмента, которым должен владеть каждый профессиональный программист и который позволяет уменьшить сроки разработки программ и повысить их надежность, переносимость и универсальность. Здесь дано описание средств стандартной библиотеки шаблонов STL: контейнеров, итераторов, потоков, функциональных объектов, адаптеров и стандартных алгоритмов. В восьмой главе излагаются основы работы с пользовательскими библиотеками (модулями) и многофайловыми проектами. Рассматриваются особенности реализации раздельной компиляции программ. Особое внимание уделяется ключевым технологиям разработки программных продуктов, отвечающим современным требованиям качества и надежности – применению компонентного и событийного подходов в разработке программных приложений. Основные понятия и механизмы данных подходов к программированию описываются в девятой главе учебника. Программные продукты, демонстрируемые в данной главе, представляют собой формы под Windows и другие операционные системы. Теоретический материал каждой главы проиллюстрирован практическими примерами, синтаксис которых соответствует стандарту языка С++. Примеры программ из глав 2–8 являются консольными приложениями (т. е. программами, для которых устройством ввода является клавиатура, а устройством вывода – монитор). Консольные приложения удобны как иллюстрации при рассмотрении общих вопросов программирования. Данный учебник предназначается студентам института математики и фундаментальной информатики Сибирского федерального университета, обучающимся по программе бакалавриата по направлениям 01.03.01 «Математика» и 01.03.02 «Прикладная математика и информатика» и рекомендуется для изучения дисциплины «Программирование».
1. ОСНОВНЫЕ ПОНЯТИЯ И ПРИНЦИПЫ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПОДХОДА 1.1. Основные понятия объектно-ориентированного программирования Объектно-ориентированное программирование является одним из наиболее эффективных и востребованных подходов в современном программировании. Объектно-ориентированное программирование представляет собой парадигму программирования, в основе которой лежат понятия объектов и классов [1]. Под термином «парадигма программирования» понимается совокупность идей и понятий, определяющих стиль написания программ, методологию разработки программного обеспечения и способ организации вычислений. Концепции, предложенные в рамках данного подхода, стали фундаментальным шагом в методологии программирования. Применение ООП позволило повысить модульность программ, улучшить структурирование кода, а также сделать процесс разработки и сопровождения сложных и объемных программ более ясным, простым и надежным. ООП сформировалось и приобрело широкую популярность во второй половине 1980-х гг., хотя базовые понятия и идеи этой парадигмы были предложены еще в конце 1960-x – начале 1970-х гг. Основателями ООП считаются норвежские ученые К. Нигаард и О. Й. Даль. Также огромный вклад в развитие методологии ООП внесли А. Кэй, Д. Ингаллс, Г. Буч, А. Голдберг, Б. Страуструп, И. Якобсон, Т. Бадд и многие другие. Главная идея объектно-ориентированного подхода – представление программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса. Объект – сущность, которая объединяет в себе данные и действия, производимые над этими данными, и рассматривается как единое целое. Данные объекта называются полями (или членами-данными). Функции объекта, выполняющие действия над полями, называются методами (или членами-функциями). Понятие класса является ключевым механизмом объектно-ориентированного подхода. Класс − абстрактный тип данных, определяемый пользователем (пользовательский тип данных) [2]. В классе задаются свойства и поведение какого-либо предмета или процесса в виде набора данных (аналогично структуре) и функций, выполняющих преобразование этих данных. Идея классов отражает строение объектов реального мира, поскольку каждый предмет или процесс обладает набором отличительных характеристик (свойств) и поведением. Создаваемый тип данных
1. Основные понятия и принципы объектно-ориентированного подхода имеет практически те же свойства, что и стандартные типы, и позволяет задать представление данных в памяти компьютера, множество значений, которые могут принимать величины данного типа, и операции над ними. Как уже было отмечено выше, объект класса – это экземпляр класса (т. е. переменная или константа этого типа), который содержит конкретные данные и работает в соответствии с описанными в классе правилами [2]. Класс является своего рода формой, определяющей, какие данные и функции будут включены в объект класса. При объявлении класса не создаются никакие объекты этого класса, по аналогии с тем, что существование типа int еще не означает существование переменных этого типа. Таким образом, класс представляет собой описание каких-то сходных между собой объектов (сходных по их характеристикам и возможным действиям). Поясним это на примере. Пусть в программе требуется работать с данными о странах. Страна – это абстрактное понятие. У нее есть такие характеристики, как название, количество населения, площадь, столица, флаг и др. Для описания страны будет использоваться класс «Страна» с соответствующими полями данных. Такие страны, как Россия, Франция и Великобритания, относятся к этому классу, т. е. они являются объектами этого класса (конкретными представителями типа «Страна», или экземплярами класса). Хотя все три страны обладают схожими характеристиками (название, количество населения, площадь и т. д.), но каждая страна имеет свое уникальное значение для каждой характеристики (свое название, свое количество населения, размер площади и т. д.). Одним из важных понятий, используемых в ООП, является понятие абстракции данных. Абстракция – выделение в моделируемом предмете только необходимых характеристик и методов, достаточных для описания объекта при решении поставленной задачи. Например, создавая класс для описания студента в программе работы деканата, следует выделить только необходимые его характеристики: фамилию, имя, отчество, номер зачетной книжки, группу, дату рождения, оценки по предметам. Нет смысла добавлять такие поля, как вес, цвет глаз или кличка его кота/собаки и т. д. 1.2. Основные принципы объектно-ориентированного программирования В основе объектно-ориентированного программирования лежат три фундаментальных принципа, определяющие его методологию: инкапсуляция, наследование и полиморфизм [3].
Объектно-ориентированное программирование на С++ Инкапсуляция – свойство объектно-ориентированного языка программирования, позволяющее объединить в единое целое данные и методы и скрыть данные и способы их обработки от внешнего воздействия, чтобы защитить их от случайного изменения. Этот принцип реализуется с помощью построения классов – пользовательских типов данных, объединяющих свое содержимое в единый тип и реализующих некоторые операции или методы над ним. Инкапсуляция позволяет изолировать класс от остальных частей программы и сделать его «самодостаточным» для решения конкретной задачи. Осуществляется это путем скрытия деталей реализации класса от его пользователей и предоставления интерфейса для работы с ним. Интерфейс – это набор методов класса, доступных для использования другими классами. К интерфейсным методам класса относятся методы, предназначенные для оперирования содержимым (значениями полей и внутренними методами). Методология ООП предполагает, что помимо различных методов, предназначенных для решения поставленной задачи, в классе обязательно должны присутствовать специальные методы, отвечающие за элементарные операции с определенным полем (так называемый интерфейс присваивания и считывания значения), которые осуществляют непосредственный доступ к полю. Наследование является вторым важнейшим принципом ООП. Наследование – способ определения новых классов, которые наследуют элементы (данные и методы) одного или нескольких уже существующих классов, модифицируя или расширяя их [4]. Класс, от которого производится наследование, называется базовым или родительским. Новый создаваемый класс называют производным или дочерним (или классом-потомком). Производный класс автоматически наследует поля и методы своего родителя и может дополнять их новыми. Поскольку каждый производный класс может быть базовым для других создаваемых классов (порождать своих потомком), может быть создана целая иерархия классов. Таким образом, принцип наследования обеспечивает поэтапное создание сложных классов и разработку собственных библиотек классов. Подробнее наследование будет рассмотрено в третьей главе учебника. Полиморфизм – свойство классов, которое позволяет использовать одно имя для обозначения действий, общих для родственных классов (из одной иерархии) и гибко выбирать требуемое действие во время выполнения программы [3]. В языке программирования С++ существуют три вида полиморфизма: 1) перегрузка функций и операций, 2) виртуальные функции, 3) шаблоны функций и классов. Перегрузка операций и функций представляет собой возможность переопределить их действия так, чтобы в зависимости от типа передаваемых данных они выполняли разные действия [4]. Так, например, перегрузка функций означает