Файл: Основные понятия объектно-ориентированного программирования).pdf
Добавлен: 22.05.2023
Просмотров: 1697
Скачиваний: 3
СОДЕРЖАНИЕ
1.ОСНОВНЫЕ ПОНЯТИЯ О ЯЗЫКАХ ПРОГРАММИРОВАНИЯ
Основы теории языков программирования
1.2. Классификации языков программирования
2. ОСНОВЫ ОБЪЕКТНО_ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ В С++
3. СОЗДАНИЕ ПРОГРАММНОГО ПРОДУКТА С ПОМОЩЬЮ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ЯЗЫКА ПРОГРАММИРОВАНИЯ С++
3.1.Практическое применение шаблонов классов в С++
3.2. Реализация программного продукта «Матричная арифметика» с помощью шаблонного класса
Появление новых возможностей аппаратного обеспечения поставило задачу перед программистами – создать программные средства, которые обеспечивают оперативное взаимодействие пользователя с ЭВМ. Их назвали диалоговыми языками.
Работы по созданию велись в двух основных направлениях:
– создавались управляющие языки для оперативного воздействия
на выполнение задач;
– разрабатывались языки, которые обеспечивали описание алгоритмов решения. [2]
Язык Бэйсик является одним из примеров диалоговых языков.
Бэйсик использует обозначения, которые похожи на обычные математические выражения. Некоторые операторы представлены упрощенными вариантами функций и операторов языка программирования Фортран.
Непроцедурные языки составляют совокупность языков, которые описывают организацию данных, что обрабатывается по фиксированным алгоритмам.
Позволяя четко описать как задачу, так и действия, необходимые для
её решения, таблицы решений дают возможность определить, какие условия должны выполнятся прежде чем перейти к какому-либо действию. [7]
Одна таблица решений, которая характеризует некоторую ситуацию, содержит все блок-схемы реализаций алгоритмов.
Отметим, что табличные методы, легко осваиваемые специалистами разных профессий.
Программы, составленные на таких языках, удобно описывают сложные алгоритмы, возникающие в системном анализе.
2. ОСНОВЫ ОБЪЕКТНО_ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ В С++
2.1. Принципы объектно-ориентированного программирования
Объектно-ориентированный подход к программированию является приоритетным при создании подавляющего большинства программных проектов.
В окончательном виде каждая программа представляет собой набор инструкций для процессора. И чем выше является уровень языка, тем
в более простой форме записываются одни и те же действия.
С наращиванием объема программ становится нужным структурировать информацию, выделять в ней главное и отбрасывать несущественное.
Этот процесс называется повышением степени абстракции программы. [9]
Первым шагом к повышению абстракции является использование функций, которое позволяет после написания и отладки функции дистанцироваться от деталей реализации, поскольку для вызова функции надо знать только ее интерфейс. [6]
Следующий шаг – объявление собственных типов данных, которые позволяют структурировать и группировать информацию, подавая ее в более естественном виде. Поскольку для работы с собственными типами данных требуются специальные функции, поэтому считается естественное группировать их вместе
с объявлением этих типов в одном месте программы и определенным образом отделить от остальных ее частей. Объединения
в модуле объявлений типов данных и функций, предназначенных для работы
с этими типами, вместе со скрытием от пользователя модуля несущественных деталей, является дальнейшим развитием структуризации программы. [3]
Все три упомянутых выше методы увеличивания абстракции имеют целью упростить структуру программы, то есть представить ее в виде небольшого количества более мощных блоков. Это позволяет управлять большим объемом информации, а, следовательно, успешно налаживать большие программы.
Введение понятия класса является развитием идей модульности.
В классе сочетаются структуры данных и функции их обработки. Идея классов является основой объектно-ориентированного программирования. [1]
Программы на C++ широко используют классы. Класс является типом данных, который определяет пользователь. В классе задаются свойства
и характер определенного предмета или процесса в виде полей данных
и функций для работы с ними. Например, класс телефон может иметь поля данных: номер, тип телефона (кнопочный или дисковый) и функции работы
с телефоном: звонок, набор номера, соединения с абонентом и тому подобное. Группировка данных и кодирования их одной переменной упрощает процесс программирования и увеличивает возможность повторного использования кода. Существенным свойством класса является то, что детали его реализации скрыто от пользователей класса
по интерфейсу. Это защищает их от случайных изменений. Интерфейсом класса является заголовки его методов.[4]
Идея классов отражает строение объектов реального мира. Ведь каждый объект или процесс имеет набор определенных характеристик или различий, иначе говоря, определенные свойства и поведение. Так, характеристиками автомобиля является марка, цвет, максимальная скорость, мощность двигателя и тому подобное; характеристиками усилителя является частотный диапазон, мощность, коэффициент нелинейных искажений и т.д. Функциональные возможности объектов тоже отличаются: автомобиль может ездить, усилитель – повышать уровень сигналов.
А пользоваться объектами можно, не зная их внутреннего строения. [8]
Например, управлять автомобилем можно, не имея никакого представления
о строении его двигателя или любых других его частей. Каждый класс занимает определенное место в иерархии классов, например, все автомобили относятся
к классу наземный транспорт (более высокого в иерархии), а класс автомобиля содержит много разновидностей автомобилей: грузовые, легковые, внедорожники
и др. [9]
Любой класс определяет категорию объектов, а каждый объект является экземпляром некоторого класса. ООП – это методика, которая концентрирует основное внимание программиста на связи между объектами, а не на деталях
их реализации.
Основными принципами на которых базируется ООП, являются: [5]
– инкапсуляция;
– наследование;
– полиморфизм.
Инкапсуляцией называется сочетание данных с функциями
их обработки вместе со скрытием лишней для пользования этими данными информации. Инкапсуляция повышает уровень абстракции программы, позволяет изменять реализацию класса без модификации основной части программы
и использовать класс в другом окружении.
Наследование – это возможность создания иерархии классов, когда классы-потомки наследуют свойства своих базовых классов (предков), могут изменять
эти свойства и приобретать новые. Свойства базовых классов (предков)
при наследовании не описываются, что сокращает объем программы.
Полиморфизм – это возможность использовать в разных классах иерархии одно имя для обозначения близких по смыслу действий и гибко выбирать соответствующие действия в ходе выполнение программы. [3]
Объектно-ориентированное программирование в никоем образе не связано
с процессом выполнение программы, а является только новым способом
ее организации, то есть новой парадигмой программирования (парадигма - набор теорий и методов, которые определяют способ организации знаний).
Существует три группы языков программирования, которые связаны
с понятием класс: объектно-ориентированные, объектные, объектно-основанные. [4]
Объектно-ориентированные языки в полном объеме поддерживают парадигму ООП: инкапсуляции, наследования и полиморфизма. Типичными представителями таких языков является C++, Java, C#.
К объектным относятся языки программирования, которые поддерживают только инкапсуляцию и позволяют создавать объекты – это языки Visual Basic
(до шестой версии включительно) и Ada. [8]
К объектно-основанным языкам программирования относят языки, которые могут использовать существующие объекты, но не имеют механизма создания объектов пользователя. Язык JavaScript является объектно-основанным языком программирования.
К программированию основные понятия ООП перешли из других областей знаний, таких как философия, логика и математика, причем,
без особых изменений, по мере того, что касается сущности этих понятий.
Классом является абстрактный тип данных, определяемый пользователем,
и изображает модель реального мира в виде данных и функций их обработки.
Данные класса называют полями или данными-членами, а функции класса – методами или функциями-членами. Поля и методы называются элементами класса. [10]
В основном спецификация класса состоит из двух частей:
– объявления класса - в нем прописаны все поля и методы (элементы данных) класса на уровне интерфейса в терминах функций-элементов;
– определение методов класса, то есть реализации конкретных функций членов данного класса.
Объявление класса имеет следующий формат:
class <имя класса>
{
[private:] <объявления скрытых элементов класса>
protected: <объявления элементов, доступных только потомкам>
public <объявления общедоступных элементов>
}; // Объявление завершается точкой с запятой
Спецификаторы доступа private, protected и public управляют видимостью элементов класса. Элементы, определенные после ключевого слова private, доступны только в этом классе. Этот вид доступа принято
в классе по умолчанию. [4]
Спецификатор доступа protected содержит поля и методы, которые скрыты от всех, кроме потомков класса. [1]
Поля и методы, определенные ключевым словом public, доступны вне класса, то есть к ним можно обращаться непосредственно из программы, используя объекты класса. Содержание общедоступного раздела public составляет абстрактную часть конструкции, то есть общедоступный интерфейс, который содержит прототипы функций-элементов или полное определение (для небольших функций).[6]
Рассмотрим пример объявления класса:
class myclass
{
private: // скрытие элементов
int a;
public: // Общедоступные элементы
void set_a (int num)
{
a = num;
} // Метод, который изменяет значение поля
int get_a ()
{
return a;
} // Метод, который возвращает значение поля};
В этом примере класс myclass содержит только одно поле данных a, которое имеет тип int, причем это поле доступно только в классе, так оно объявлено
с ключевым словом private. Обращение к этому полю из программы невозможно
и повлечет ошибку. [4]
Однако доступ к данным можно организовать с помощью методов, которые еще называют методами доступа. Такими в классе myclass есть два метода: set_a(), который присваивает полю значение, и get_a(), который возвращает значение поля. Эти методы доступны за пределами класса, поскольку они объявлены ключевым словом public.
Тела обоих методов (код функций) содержатся непосредственно
в объявлении класса. Здесь реализация функций не означает, что код функции размещается в памяти. Это произойдет лишь при создании объекта класса. [6]
Методы класса, определенные подобным образом, по умолчанию являются встроенными функциями. При увеличении методов по количеству и объему, определение функций класса как встроенных может вызвать беспорядки
в объявлении класса. Чтобы избежать этого, функции внутри класса зачастую
не определяются, а только объявляются (т.е. размещаются их прототипы), а само определение функций происходит в другом месте.
2.2.Основная информация о С++
С момента своего создания язык программирования C++ потерпел три значительных совершенствования, то есть каждый раз он как дополнялся новыми средствами, так и в чем-то был изменен.[9]
Первой ревизии язык C++ была подвергнут в 1985 г., второй –в 1990 г. Третья ревизия состоялась в процессе его стандартизации, которая началась
в начале 1990-х годов. Для этого специально был сформирован ISO-комитет, который в январе 1994 года принял первый проект стандарта языка С++.
В данный проект были внесены средства, впервые определенные Бьярном Страуструпом.
После завершения работы над начальным стандартом языка программирования C++, произошло событие, что заставило расширить полученный стандарт. Речь идет о создании библиотеки STL – Стандартной Библиотеки Шаблонов – набора обобщенных функций, которые используются для обработки данных. [1]
На собрании ISO-комитета участники проголосовали за внесение STL
в спецификацию языка C++. Именно эта библиотеки расширила сферу применения средств C++ далеко за пределами первоначального
ее определения.
Отметим, что в стандартной библиотеке C++ содержится стандартная библиотека языка Си с небольшими изменениями, что делают ее более гибкой
и функциональной. Другая часть библиотеки C++ основана
на библиотеке STL. Она предоставляет такие инструменты, как контейнеры (векторы, списки) и итераторы (аналог указателей), которые предоставляют доступ
к контейнерам так, как и к массивам с помощью индексов. [5]
Так же библиотека STL позволяет работать и с другими контейнерами (ассоциативными списками, очередями, стеками). Используя шаблоны, есть возможность писать обобщенные алгоритмы, которые способны работать
с различными последовательностями или контейнерами, доступ к членам которых обеспечивается итераторами.[2]