- •Технологии программирования Структурное и объектно-ориентированное программирование
- •Классы и потоки ввода-вывода
- •Стандартный ввод-вывод
- •Ввод для встроенных типов
- •Вывод для встроенных типов
- •Управление вводом-выводом
- •Классы, инкапсуляция, объекты
- •Управление доступом к элементам класса
- •Список элементов класса
- •Определение методов класса
- •Вызов метода и доступ к элементам класса
- •Конструкторы и деструкторы
- •Инициализация конструкторов класса
- •Полиморфизм. Перегрузка функций
- •Перегрузка конструкторов
- •Функция с параметрами по умолчанию
- •Конструктор по умолчанию
- •Конструктор копирования
- •Обобщение перегрузки конструкторов и инициализации объектов
- •Полиморфизм. Перегрузка операций
- •Динамическое выделение памяти
- •Динамическое выделение памяти в конструкторе
- •Копирование динамических объектов
- •Наследование и контроль доступа Базовые и производные классы
- •Использование конструкторов с параметрами при наследовании
- •Множественное наследование
- •Полиморфизм. Виртуальные функции
Технологии программирования Структурное и объектно-ориентированное программирование
Разработка программного обеспечения (ПО) ЭВМ в настоящее время осуществляется с использованием двух основных технологий — структурного (процедурного) программирования и объектно-ориентированного программирования (ООП).
Структурное программирование.
Данная технология предполагает выполнение последовательности этапов разработки программ для решения задач с использованием ЭВМ.
Постановка задачи – формулирование задачи и целей ее решения на естественном языке и установление критериев решения задачи. Результат этапа – техническое задание на разработку ПО.
Формализация задачи с использованием математического аппарата и получение ее абстрактной математической модели в виде формул и уравнений.
Выбор численного метода из возможных вариантов с учетом требований по времени и точности решения и занимаемого объема памяти ЭВМ.
Алгоритмизация – построение общего плана решения, т. е. алгоритма задачи в виде логической последовательности этапов (шагов, действий, операций), приводящих от исходных данных к искомому результату за конечное время на языке понятном человеку. Могут быть использованы различные способы представления алгоритма – словесный, графический (схемы алгоритмов), алгоритмический язык высокого уровня (ЯВУ). ЯВУ – формализованный язык для описания данных и набор правил (инструкций, операторов) их обработки для реализации алгоритма задачи. Типичные ЯВУ структурного программирования – Си, Паскаль.
Программирование – перевод алгоритма задачи на язык ЭВМ (систему команд), т.е. кодирование алгоритма. Процесс разработки программы делится на следующие этапы: 1) запись алгоритма на ЯВУ в виде исходного файла в памяти (например, prog1.cpp); 2) компиляция и редактирование связей (объектный файл – prog1.obj); 3) загрузка программы в оперативную память (исполняемый файл – prog1.exe); 4) исполнение программы; 5) получение результатов программы.
Отладка программы – поиск и исправление ошибок в программе. Этот процесс разбивается на два этапа: 1) синтаксическая отладка – исправление формальных ошибок, связанных с нарушением норм языка программирования, с помощью ЭВМ; 2) семантическая отладка – исправление логических (смысловых) ошибок с применением специальных тестовых данных.
Исполнение (эксплуатация) программы с любыми допустимыми данными и получение результатов решения задачи.
Интерпретация результатов и поддержка программы в процессе эксплуатации – изменение программы в соответствии с требованиями пользователей, а также исправление ошибок, выявленных в процессе ее эксплуатации.
Существование программы можно разделить на три периода: 1) разработка (этапы 1– 4); 2) реализация (этапы 5, 6); 3) сопровождение (этапы 7, 8).
Функциональная декомпозиция.
При решении сложной задачи разработка и реализация ее алгоритма потребует написания длинной программы, которую трудно отлаживать из-за возможного большого числа ошибок. Внесение изменений вызовет необходимость дополнительного выполнения этапов разработки и реализации программы в целом.
Целесообразно такую задачу разбить на легко решаемые подзадачи, которые в совокупности дают решение исходной задачи. Такой метод решения задач называется функциональной декомпозицией. Для применения этого метода на ЭВМ используется принцип модульного программирования. Каждая подзадача реализуется в виде отдельной подпрограммы (функции, процедуры). Для решения всей задачи создается главная функция, которая вызывает другие функции, передавая им исходные аргументы и получая промежуточные результаты.
Большую программу целесообразно разделить на несколько программных модулей (автономно компилируемых файлов), например, файл подпрограмм и файл главной функции, а для их соединения в общую программу создается файл проекта. При этом файл подпрограмм можно рассматривать как библиотеку готовых подпрограмм, которые можно использовать в других задачах, что сократит время их решения.
Для структурного программирования характерно то, что данные и методы их обработки (функции, процедуры) отделены. Данные рассматриваются как пассивные элементы, обрабатываемые функциями.
Концепции объектно-ориентированного программирования (ООП).
Идеи ООП впервые были выдвинуты и реализованы в 60-е годы 20-го века авторами языков Simula-67 (Дал и Нигард) и Smaltalk.
Главная причина возникновения ООП связана с поиском путей для создания очень сложных программ, отражающих сложность мира и способов его описания. ООП представляет собой технологию программирования, в основе которой лежит подход, позволяющий людям формировать модели объектов реального мира. Чтобы справиться со сложностями жизни, человечеству потребовалось выработать способность обобщать, классифицировать и генерировать абстракции.
ООП базируется на следующих ключевых понятиях: 1) объект (object); 2) класс (class); 3) инкапсуляция (encapsulation); 4) наследование (inharitance); 5) полиморфизм (polimorphism); 6) абстракция типов (abstraction).
Раскроем эти понятия в общем плане.
Объект. Наш мир состоит из объектов, которые обладают некоторыми свойствами и которым присуще определенное поведение. Объект — это логическая единица, которая содержит совокупность данных (атрибутов), определяющих его отличительные свойства, и правила, описывающие его поведение. В программе объект содержит данные (DATA) и код (CODE), который манипулирует этими данными.
Класс. Объекты, обладающие некоторым общим набором атрибутов (отличительных черт) и схожим поведением объединяют в классы объектов. Например, из реального мира, в котором существует множество конкретных собак, можно выделить абстрактный класс СОБАКА, отличающийся от классов других животных. Такой подход позволяет разрабатывать и развивать идеи, касающиеся собак, абстрагируясь от особенностей отдельной особи. Таким образом, класс – это новый обобщенный тип объектов. Он определяет, каким образом ведут себя любые объекты этого типа, как они создаются (порождаются), как с ними взаимодействуют другие объекты, как они уничтожаются. После описания класса можно объявить его конкретные экземпляры-объекты.
Инкапсуляция – это объединение набора данных и структур данных с группой методов (функций) манипулирования этими данными в единое целое, называемое классом, в котором также определены механизмы защиты данных и функций, которые могут быть частными (private), общими (public), или защищенными (protected) и установлены права доступа к данным.
Наследовании – это механизм создания новых, производных классов, которые наследуют данные и функции от одного или нескольких ранее определенных базовых классов. При этом возможны переопределение или добавление новых данных м методов. В результате создается разветвленная иерархия классов (дерево классов), корнем которой является наиболее общее понятие.
Например, СОБАКА
____________________|____________________
| | |
сторожевая охотничья домашняя ...
| | |
овчарка .... лайка ... болонка ...
Из производного класса можно получить определенный доступ к данным и функциям базового класса. Таким образом, наследование дает возможность передачи некоторых свойств одного объекта другому. Его важной особенностью является возможность поддержки концепции классификации объектов. Наследование позволяет строить иерархию объектов, переходя от более общего к более частному, уточняя и конкретизируя объект.
Полиморфизм по своей сути означает то, что одно и то же имя может быть использовано для логически связанных, но различных целей, т.е. имя определяет порядок действий, которые в зависимости от типа данных могут существенно отличаться. Например, можно определить функцию вычисления суммы двух величин, которая будет получать целые или вещественные аргументы summa(x, y). При вызове функции анализируется тип аргументов и выполняется код, соответствующий этому типу. В языке С++ полиморфизм поддерживается на этапе компиляции и на этапе выполнения программы (раннее и позднее связывание).
Абстракция типов. Обобщение понятия класса позволяет определить абстрактный класс, который имеет одну важную черту – нельзя создать объект этого класса. Абстрактный класс должен использоваться как базовый класс, от которого наследуются другие производные классы (например, абстрактный класс СОБАКА).
Резюме.
Рассмотренные ключевые понятия класса позволяют сказать, что в ООП введено понятие класса объектов и реализованы механизмы формализации, позволяющие: 1) описывать структуру объекта; 2) описывать действия с объектами; 3) использовать специальные правила наследования объектов; 4) устанавливать различную степень защиты компонентов объектов и определять различные права доступа к ним; 5) передавать свойства одних объектов другим; 6) передавать сообщения между объектами.
Таким образом, в основе ООП лежит идея моделирования объектов реального мира посредством иерархически связанных классов. Можно дать следующее определение ООП – это технология создания новых типов данных и объектов, которые наследуют определенные черты существующих (ранее созданных) типов данных и объектов.
Важное место в ООП занимает структура программы. Необходима большая работа на предварительных этапах по созданию классов объектов с целью формирования эффективных библиотек классов. Эти этапы носят название объектно-ориентрованная разработка (ООР) классов.
Использование подходов, принятых в ООП, дает следующие преимущества.
Предоставляется возможность создания более сложных программ при снижении трудоемкости программирования.
Стиль написания программ повышает доступность ее восприятия и упрощает внесение возможных изменений (модификация программ).
Существенно упрощается процедура поиска ошибок. Повышается надежность программ.
Сложные программы могут быть декомпозированы на изолированные подзадачи, что позволяет создавать большие системы (проекты) коллективом одновременно работающих программистов.
Полезно иметь ввиду такой момент – функциональная декомпозиция и ООП не являются отдельными не связанными друг с другом методами. ООП разбивает задачу на объекты. Объекты не только содержат данные, но и функции, для которых требуются алгоритмы. Нередко эти алгоритмы настолько сложны, что требуют дробления на более мелкие части с использованием функциональной декомпозиции. Таким образом, опытным программистам необходимо знать оба метода и уметь ими пользоваться.
ОСОБЕННОСТИ ЯЗЫКА С++
Язык С++ является надстройкой над языком С (его надмножеством). Он сохраняет все алгоритмические возможности структурного (процедурного) программирования и дополняет их идеями ООП. С++ расширяет существующие конструкции языка С. Программы на С могут компилироваться в среде С++, но не наоборот. Появляются новые средства для ввода-вывода данных и известных в С операций, а также совсем новые конструкции и правила организации программ для реализации концепций ООП. Помимо возможностей предоставляемых С, С++ обеспечивает гибкие и эффективные средства определения новых типов. Можно разделить программу на несколько фрагментов, определив новые типы, отражающие базовые концепции предметной области. Такой способ разработки программ часто называют абстракцией данных. Объекты типов, определяемых пользователем, содержат необходимую информацию, свою для каждого типа. Такие объекты можно удобно и безопасно использовать даже в контексте, где их тип нельзя определить во время компиляции. Подобные методы дают более короткие и простые в сопровождении программы.
Ввод-вывод в С++
