И.А. Волкова, А.В. Иванов, Л.Е. Карпов - Основы объектно-ориентированного программирования. Язык программирования С++ (ЧБ) (1114895), страница 2
Текст из файла (страница 2)
Язык C++ вобрал в себя не только некоторые концепции языкаС, а также и некоторых других языков. Например, концепция классов взята автором С++ из языка Simula [10], а концепция наследования – из языка Smalltalk.Следует отметить, что развитие языка C++, а также сопряженное с нимразвитие технологии программирования, в частности, развитие COM (ComponentObject Model) технологии [5] приводит к некоторому отступлению от строгойтеории ООП. Так, в COM-технологии требуется наличие базового надкласса, чтоотсутствует в теории ООП.Некоторые отступления также имеются в визуальных реализациях C++:Visual C++ [6] в рамках пакета Microsoft Visual Studio, C++ Builder [3] фирмыBorland.В данном учебном пособии C++ рассматривается в строго теоретическомаспекте.1.1.Краткий обзор основных парадигм программированияВ соответствии с концепцией фон-Неймана – основателя теоретическойконцепции компьютерной техники, процессор обрабатывает данные, выполняяинструкции (команды), которые находятся в той же оперативной памяти, что иданные.Таким образом, можно выделить две основные сущности процесса обработки информации: код, как совокупность инструкций, и данные.
Все программыв соответствии с выбранной технологией программирования концептуально организованы вокруг своего кода или вокруг своих данных.Рассмотрим основные на сегодняшний день парадигмы программирования:1) Процессно-ориентированная парадигма, при которой программапредставляет собой ряд последовательно выполняемых операций – модельфон-Неймана. При этом код воздействует на данные. Языки, реализующие эту парадигму, называются процедурными или императивными.
Такими языками являются, например, C, Pascal и др.52) Объектно-ориентированная парадигма, при которой программа рассматривается как совокупность фрагментов кода, обрабатывающих отдельные совокупности данных – объекты. Эти объекты взаимодействуютдруг с другом посредством так называемых интерфейсов. При этомданные управляют доступом к коду.При повышении сложности алгоритма процессно-ориентированная парадигма сталкивается с существенными проблемами. Переход к объектным принципам программирования позволяет значительно улучшить внутреннюю организацию программы, в результате чего повышается производительность приразработке программных комплексов.Наряду с двумя вышеизложенными основными в настоящее время парадигмами программирования используются еще две парадигмы:3) Аппликативная или функциональная парадигма.
Основная идея данного подхода заключается в формализованном определении функции,которую выполняет программа. Таким образом, вместо определения последовательности состояний, через которые должен пройти компьютер,чтобы получить требуемый результат, необходимо определить функцию,при применении которой к исходным данным получается требуемое решение:y = f (x)Разработка программы при этом подходе сводится к конструированиюсложной функции из имеющихся стандартных простых функций:y = f1 ( f 2 ( f 3 (...), f 4 (...),...))Языками, поддерживающими такую парадигму, являются, например, языкиLISP и ML.
Данные при таком подходе, так же, как и код, представляются списками одинаковой структуры, значит, программа, работая под управлением интерпретатора, может обрабатывать свой собственный код, как данные. В этомслучае стирается грань между кодом и данными. Поэтому одной из важных областей применения данной парадигмы являются системы искусственного интеллекта (ИИ).Примечание. Обрабатывать коды, как обрабатывают данные, можно и при использовании процессно-ориентированного подхода, однако, при этом программирование должно производиться в среде низкого уровня – на языке ассемблера.4) Парадигма, основанная на использовании системы правил (парадигмалогического программирования).
При этом подходе операторы программы выполняются не в той последовательности, в которой они написаны, а на основе анализа разрешающих условий (РУ).Программа при такой парадигме состоит из списка пар:6РУ1 → D1РУ 2 → D 2................РУ N → DNЗдесь D1 , D2 ,..., DN – действия, выполняемые в случае истинности соответствующих разрешающих условий РУ1 , РУ 2 ,..., РУ N .Выполнение программы заключается в циклической проверке разрешающихусловий и выполнения действий, соответствующих разрешающим условиям, вслучае истинности последних.Примером языка логического программирования является язык PROLOG.Структура программы при логическом программировании концептуальносвязана с теоретической концепцией нормальных алгоритмов Маркова, представляющей алгоритм преобразования информации в виде совокупности подстановок:T11 → T12T21 → T22.............TN 1 → TN 2Операторы с разрешающими условиями и подстановки просматриваютсяциклически до обнаружения завершающего условия.В данном курсе рассматривается парадигма ООП.1.2.Основные принципы ООПЦентральной идеей ООП является реализация понятия "абстракция".Смысл абстракции заключается в том, что сущность произвольной сложностиможно рассматривать, а также производить определенные действия над ней, какнад единым целым, не вдаваясь в детали внутреннего построения и функционирования.При создании программного комплекса необходимо разработать определенные абстракции.Пример: Задача составления расписания занятий.Необходимые абстракции: студент, курс лекций, преподаватель, аудитория.Операции:− Определить студента в группу− Назначить аудиторию для группы− ..........Одним из основных способов создания абстракции является использованиеконцепции иерархической классификации.
Ее суть заключается в том, чтосложные системы разбиваются на более простые фрагменты.Практически все сложные системы иерархичны, и уровни их иерархии отражают различные уровни абстракции. Для каждой конкретной задачи рассмат7ривается соответствующий уровень. Выбор низшего уровня абстракции достаточно произволен. Выбранный уровень в одном случае в качестве низшего уровняможет оказаться уровнем достаточно высокой абстракции в другом проекте.Различают типовую иерархию и структурную иерархию, которые далеемы будем называть соответственно структурой классов и структурой объектов.Во всех объектно-ориентированных языках программирования реализованыследующие основные механизмы (постулаты) ООП:• Инкапсуляция• Наследование• ПолиморфизмВсе эти механизмы важны для разработки и использования абстракций.1) Инкапсуляция – механизм, связывающий вместе код и данные, которыми он манипулирует, и одновременно защищающий их от произвольногодоступа со стороны другого кода, внешнего по отношению к рассматриваемому.Доступ к коду и данным жестко контролируется интерфейсом.Основой инкапсуляции при ООП является класс.Механизма инкапсуляции позволяет оставлять скрытыми от пользователянекоторые детали реализации класса (то есть инкапсулировать их в классе), чтоупрощает работу с объектами этого класса.fork - exec2) Наследование – механизм, с помощью которого один объект (производного класса) приобретает свойства другого объекта (родительского, базовогокласса).
При использовании наследования новый объект не обязательно описывать, начиная с нуля, что существенно упрощает работу программиста. Наследование позволяет какому-либо объекту наследовать от своего родителя общие атрибуты, а для себя определять только те характеристики, которые делают егоуникальным внутри класса.Наследование есть очень важное понятие, поддерживающее концепциюиерархической классификации.3) Полиморфизм – механизм, позволяющий использовать один и тот жеинтерфейс для общего класса действий.Пример: Имеются 3 типа стека для хранения:o целых чиселo чисел с плавающей точкойo символовВместо трех подпрограмм управления в объектно-ориентированной программе требуется всего одна подпрограмма (один интерфейс)Общая концепция полиморфизма: один интерфейс – много методов.Выбор конкретного действия (метода) применительно к конкретной ситуации возлагается на компилятор.
Программисту же достаточно запомнить и применить один интерфейс, вместо нескольких, что также упрощает работу.8Различаются статический (реализуется на этапе компиляции с помощьюперегрузки функций и операций), динамический (реализуется во время выполнения программы с помощью механизма виртуальных функций) и параметрический (реализуется на этапе компиляции с использованием механизма шаблонов) полиморфизм.Примечание. Рассмотренные понятия абстракции, инкапсуляции, наследования,полиморфизма присущи не только парадигме ООП. Так, выполнение арифметическихопераций над целыми числами и числами с плавающей точкой осуществляются в процессоре по разным алгоритмам.
Однако в данном случае полиморфизм проявляется неявно.1.3.Абстрактные типы данныхТипы данных, создаваемые пользователем (программистом), называютсяпользовательскими типами данных. Пользовательский тип данных с полностью скрытой (инкапсулированной) внутренней структурой называется абстрактным типом данных (АТД).В С++ АТД реализуется с помощью классов, в которых нет открытых членов-данных, то есть вся структура этих классов скрыта от внешнего пользователя.2.Отличия С и С++Объектно-ориентированный язык программирования С++ унаследовал типыданных, операции и управляющие конструкции процедурного языка С (стандартС90).Кроме реализации принципов объектно-ориентированного программирования в язык С++ по сравнению с С внесены и некоторые другие изменения, которые сделали его лучше и удобнее, чем С.
Рассмотрим основные их них.2.1.Работа с динамической памятьюВ языке C++ для работы с динамической памятью введены операции new иdelete, которыми можно пользоваться наряду с функцией стандартной библиотекиС malloc.Операция new используется как для выделения памяти для одного объекта(при этом возможна инициализация выделенной памяти передаваемым значением), так и для массива однородных объектов. Операция new возвращает адресначала выделенной динамической памяти соответствующего типа.Ее синтаксис:new тип;new тип (выражение-инициализатор);new тип [выражение_размерность_массива];Пример:int * p;int * q;p = new int(5);////q = new int[10]; ////выделение памяти и инициализациязначением 5выделение памяти для массива из 10элементов9Операция delete освобождает распределенную операцией new память. Еесинтаксис:delete указатель_на_объект;delete [ ] указатель_на_массив_объектов;Первая форма используется, если операцией new размещался единичный(скалярный) объект.