Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Объектно-ориентированное программирование на С++

Покупка
Основная коллекция
Артикул: 766145.01.99
Рассмотрены основные концепции объектно-ориентированного, обобщенного и событийного программирования. В качестве языка программирования выбран язык C++. Подробно изложены принципы и механизмы работы с классами и объектами, в том числе наследование, перегрузка функций и операций, виртуальные функции, шаблоны функций и классов. Большое внимание уделено работе со стандартной библиотекой шаблонов, раздельной компиляции программ и применению компонентного и событийного подходов в разработке программных приложений. Предназначено для студентов бакалавриата, обучающихся по направлениям подготовки 01.03.01 «Математика» и 01.03.02 «Прикладная математика и информатика».
Объектно-ориентированное программирование на С++ : учебник / И. В. Баранова, С. Н. Баранов, И. В. Баженова [и др.]. - Красноярск : Сиб. федер. ун-т, 2019. - 288 с. - ISBN 978-5-7638-4034-6. - Текст : электронный. - URL: https://znanium.com/catalog/product/1819676 (дата обращения: 07.05.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
Министерство науки и высшего образования Российской Федерации
Сибирский федеральный университет

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ 
ПРОГРАММИРОВАНИЕ НА С++

Допущено учебно-методическим советом Сибирского федерального 
университета в качестве учебника для студентов, обучающихся по направлениям подготовки бакалавров 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]. Так, например, перегрузка функций означает 

1. Основные понятия и принципы объектно-ориентированного подхода 

выбор из нескольких вариантов подходящей функции по соответствию передаваемых ей параметров. Более подробно перегрузка операций и функций будет 
рассмотрена в четвертой главе.
Другим примером полиморфизма является механизм виртуальных функций. Данный механизм означает способность объектов самим определять, какие 
методы они должны выполнить в зависимости от того, к какому классу они относятся, причем выбор метода для вызова осуществляется во время исполнения 
программы. Пятая глава учебника посвящена изучению механизма виртуальных 
функций.
Третий вид полиморфизма – шаблоны – иначе называют обобщенным программированием. Шаблоны позволяют использовать одни и те же функции или 
классы для работы с данными разных типов. Так, например, шаблоны функций 
создают семейства родственных функций, в которых выполняются одни и те же 
действия (алгоритмы), но только над данными разных типов. Особенности синтаксиса и работы с шаблонами рассмотрены в шестой главе учебника.

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

1.3. Преимущества и недостатки  
объектно-ориентированного подхода  
к программированию

Объектно-ориентированное программирование возникло в результате 
развития идеологии структурного программирования. 
Структурное программирование – методология разработки программного обеспечения, в основе которой лежит представление программы в виде 
иерархической структуры блоков. Данная парадигма программирования была 
предложена в начале 1970-х Э. Дейкстрой, дополнена Н. Виртом, Б. Мейером, 
Т. Хоаром и другими авторами. В соответствии с данной парадигмой любая программа строится без использования оператора безусловного перехода goto из 
трех базовых управляющих структур: последовательности, ветвления и цикла; 
кроме того, используются подпрограммы (функции и процедуры). Разработка программы ведется пошагово, методом «сверху вниз» [5]. Также важными 
свойствами структурного подхода является возможность описания собственных 
(пользовательских) типов данных (структур, объединений и т. д.) и группировки 
функций и связанных с ними данных в отдельные файлы (модули).

Объектно-ориентированное программирование на С++

Следование принципам структурного программирования позволило улучшить структурированность программ, сделать тексты программ нормально читаемыми и упростить процесс разработки и сопровождения программ. Но в непрекращающемся процессе роста и усложнения программ постепенно стали 
выявляться недостатки структурного программирования. Перечислим основные 
проблемы этой методологии:
1. Данные и подпрограммы их обработки формально не связаны.
2. Нет возможности для поддержания правильного значения переменных 
программы, так как часто разные переменные программы хранят связанные значения, и за поддержание этой логической связности несет ответственность программист. 
3. Программы получаются большие и сложные, причем структура взаимосвязей функций между собой имеет достаточно непростой вид.
4. Возникают трудности в модификации программы, так как изменение 
в глобальных данных может привести к изменению всех функций, работающих 
с ними.
5. Отделение данных от функций не позволяет описывать объекты реального мира.
Идеи структурного программирования получили свое дальнейшее развитие 
в ООП, причем использование объектно-ориентированного подхода позволило объединить данные и методы их обработки, упростить структуру программ, повысить 
модульность, добиться управляемости крупных программных продуктов и решить 
все перечисленные выше проблемы. Отметим основные преимущества ООП:
1. Предоставляет возможность описывать объекты реального мира.
2. Позволяет объединять данные и операции, которые могут выполняться 
над этими данными, в единое целое, а также защищает доступ к данным объекта 
(с помощью принципа инкапсуляции). 
3. Минимизирует затраты на перепрограммирование при модифицировании существующих функций (использование наследования и полиморфизма).
4. Реализует повторное использование кода (при написании наследуемых 
классов и шаблонов), что уменьшает объем программ и сокращает время на написание исходного кода.
5. Снижает количество межмодульных вызовов и объем информации, передаваемой между модулями.
6. Выполняет «естественное» разбиение программного кода на отдельные модули, которое существенно облегчает его разработку.
7. Использует стандартные компоненты (обобщенные классы), что позволяет унифицировать структуру и пользовательский интерфейс программы, а также облегчает ее понимание и упрощает ее применение.

1. Основные понятия и принципы объектно-ориентированного подхода 

Конечно, объектно-ориентированный подход не лишен своих недостатков. Перечислим их:
• требуется достаточная квалификация в области программирования 
и разработки программных продуктов; 
• необходимо освоить большой объем информации по синтаксису и механизмам объектно-ориентированного подхода;  
• при разработке программы значительно увеличивается время на предварительный анализ предметной области и проектирование системы;
• плохо разработанная иерархия классов приводит к созданию сложных 
и запутанных программ;
• инкапсуляция снижает скорость доступа к данным;
• созданные программы часто неэффективны в отношении памяти;
• использование стандартных компонентов и алгоритмов может  потребовать от программиста изучения объемных библиотек классов.
Необходимо отметить, что концепция ООП включает в себя классическое 
процедурное и структурное программирование, т. е. использует все основные 
достижения и принципы этих двух методологий: базовые конструкции программирования (последовательное выполнение операторов, ветвление и цикл); подпрограммы (функции и процедуры), модули, технологию пошаговой разработки 
программы и т. д.

1.4. Объектно-ориентированные языки  
программирования

Объектно-ориентированные языки программирования – языки, построенные на принципах объектно-ориентированного программирования [6].

На данный момент большинство существующих языков программирования являются объектно-ориентированными. Перечислим некоторые из известных 
языков программирования, реализующих ООП-парадигму: С++, Java, C#, Delphi, 
Python, Ruby, Objective-C, Perl, ActionScript, PHP, Scala, JavaScript, Lua, Visual Basic, 
Simula, Smalltalk, Objective Pascal, Eiffel, Ada, D и многие другие.

Впервые основные понятия и идеи ООП (объекты, классы, виртуальные 
методы и др.) были предложены в языке Simula (1967 г.). Несмотря на наличие 
синтаксических конструкций, используемых в современных языках ООП, язык 
Simula традиционно не считается объектно-ориентированным языком в каноническом смысле этого слова. 
Первым широко распространенным объектно-ориентированным языком 
программирования стал Smalltalk, разработанный А. Кэйем, Д. Ингаллсом и дру