Введение в объектно-ориентированное программирование на основе алгоритмического языка Си++
Выбери формат для чтения
Загружаем конспект в формате doc
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Лекция №1. Введение в объектно-ориентированное программирование на основе алгоритмического языка Си++
Содержание: объектно-ориентированное программирование как продолжение структурного; понятие класса и объекта; поля и методы класса; личные и общие элементы класса; конструкторы и деструкторы; пример консольного приложения, использующего классы.
1. Развитие технологии программирования
1.1. Понятие технологии программирования
Создание современной программной системы – весьма трудоёмкая задача. Будущий специалист в области разработки программного обеспечения должен иметь представление о методах анализа, проектирования, реализации и тестирования программных систем.
Технологией программирования называют совокупность методов и инструментальных средств, используемых в процессе разработки программного обеспечения. Как любая другая технология, технология программирования представляет собой набор технологических инструкций, включающих:
- указание последовательности выполнения технологических операций;
- перечисление условий, при которых выполняется та или иная операция;
- описания самих операций, где для каждой операции определены исходные данные, результаты, а также инструкции, нормативы, стандарты, критерии и методы оценки.
1.2. Виды технологий программирования
С развитием вычислительной техники и программного обеспечения совершенствовались и технологии разработки программ. Различают следующие этапы развития программирования и соответствующие им виды технологий.
Первый этап охватывает период от появления первых вычислительных машин до середины 60-х гг. XX в. Это период отсутствия технологий программирования, когда разработка программ считалась особым видом творчества, искусством. Иногда говорят о «стихийных» технологиях программирования. Существенным явлением было появление в алгоритмических языках средств, позволяющих оперировать подпрограммами. Типичная программа того времени состояла из основной программы, области глобальных данных и набора подпрограмм. Появление средств поддержки подпрограмм позволило осуществлять разработку программного обеспечения нескольким программистам параллельно.
В начале 60-х гг. XX в. разразился «кризис программирования». Он выражался в том, что фирмы, взявшиеся за разработку сложного программного обеспечения, срывали сроки завершения проектов. Проект устаревал раньше, чем был готов к внедрению, увеличивалась его стоимость, и в результате многие проекты так никогда и не были завершены. Объективно все это было вызвано несовершенством технологии программирования. В отсутствии чётких моделей описания подпрограмм и методов их проектирования создание каждой подпрограммы превращалось в непростую задачу, интерфейсы подпрограмм получались сложными, и при сборке программного продукта выявлялось большое количество ошибок согласования. Исправление таких ошибок, как правило, требовало серьёзного изменения уже разработанных подпрограмм, что ещё более осложняло ситуацию, так как при этом в программу часто вносились новые ошибки, которые также необходимо было исправлять. Анализ причин возникновения большинства ошибок позволил сформулировать новый подход к программированию, который был назван «структурным».
Второй этап развития технологий программирования (60 – 80-е гг. XX в.) характеризуется преобладанием структурного подхода к программированию. Этот подход представляет собой совокупность рекомендуемых технологических приёмов, охватывающих выполнение всех этапов разработки программного обеспечения. В основе структурного подхода лежит декомпозиция (разбиение на части) сложных систем с целью последующей реализации частей в виде независимых подпрограмм. С появлением других принципов декомпозиции (объектного, логического и т.д.) данный способ получил название процедурной декомпозиции. Структурный подход требовал представления задачи в виде иерархии подзадач простейшей структуры. Проектирование программ, таким образом, осуществлялось «сверху вниз» (нисходящим способом) и подразумевало реализацию общей идеи, обеспечивая проработку интерфейсов подпрограмм. Такой подход назывался методом пошаговой детализации. Одновременно вводились ограничения на конструкции алгоритмов (управляющие структуры).
Кратко положения структурного программирования можно сформулировать следующим образом. Структурное программирование подразумевает:
• точно обозначенные управляющие (основные) структуры алгоритмов;
• соответствующее логике программы разбиение ее на программные блоки;
• автономные подпрограммы, в которых преимущественно используются локальные переменные;
• отсутствие (или, по крайней мере, ограниченное использование) операторов безусловного перехода – goto, break и др.
Последовательное применение концепций структурного программирования предполагает на каждом этапе проектирования программы разделение задачи на связанные между собой подзадачи, при этом программа разбивается на логически завершенные и стандартно кодируемые части. В результате код программы понятные легко читается не только ее автором, но и другими программистами, и число ошибок при программировании существенно уменьшается. Естественно, преимущества структурного программирования наиболее ярко проявились при написании больших программ, когда проектирование программы просто невозможно без разделения части. Но и при создании средних и малых программ структурный подход давал хорошие результаты.
Структурное программирование требует ясности и аккуратности в написании программных кодов. В частности, необходимо использование обозначений данных, подпрограмм и модулей, соответствующих их назначению. Кроме того, требуется структуризация программного кода не только по существу, в соответствии выше изложенными принципами структурного программирования, но и структуризация теста программного кода, то есть наличие отступов, написание операторных скобок (например, begin и end) в определенном порядке (например, друг под другом), аккуратное написание комментариев. Все это делает программный код удобным для анализа и модификации.
Поддержка принципов структурного программирования была заложена в основу так называемых процедурных языков программирования. Среди наиболее известных языков этой группы стоит назвать PL/1, ALGОL, Pascal, С.
В рамках структурного программирования получило развитие модульное программирование, которое предполагает выделение групп подпрограмм, использующих одни и те же глобальные данные в отдельно компилируемые модули (библиотеки подпрограмм), например, модуль графических ресурсов, модуль подпрограмм вывода на принтер.
Связи между модулями при использовании данной технологии осуществляются через подготовленный интерфейс, в то время как доступ к реализации модуля (телам подпрограмм и некоторым «внутренним»переменным) запрещён. Эту технологию поддерживают современные версии языков Pascal и С (С++), языки Ада и Modula.
Использование модульного программирования существенно упростило разработку программного обеспечения несколькими программистами. Теперь каждый из них мог разрабатывать свои модули независимо, обеспечивая взаимодействие модулей через специально оговоренные межмодульные интерфейсы. Кроме того, модули в дальнейшем без изменений можно было использовать в других разработках, что повысило производительность труда программистов.
Узким местом модульного программирования является то, что ошибка в интерфейсе при вызове подпрограммы выявляется только при выполнении программы (из-за раздельной компиляции модулей обнаружить эти ошибки раньше невозможно). При увеличении размера программы обычно возрастает сложность межмодульных интерфейсов, и с некоторого момента предусмотреть взаимовлияние отдельных частей программы становится практически невозможно. Для разработки программного обеспечения большого объёма было предложено использовать объектный подход, не отменяющий структурное и модульное программирование, а являющийся их развитием.
Объектно-ориентированный подход к программированию сформировался к середине 80-х гг. ХХ века, открыв третий этап развития технологий программирования.
Объектно-ориентированное программирование определяется как технология создания программного обеспечения, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определённого типа (класса), а классы образуют иерархию с наследованием свойств.
Объекты впервые были использованы в языке Simula (имитационного моделирования сложных систем) ещё в 60-х гг. XX века. Естественный для языков моделирования способ представления программы получил развитие в другом языке моделирования – языке Smalltalk (70-е гг. XX в.), а затем был использован в новых версиях универсальных языков программирования, таких как Pascal, С++, Modula, Java.
Основным достоинством объектно-ориентированного программирования по сравнению с модульным программированием является «более естественная» декомпозиция программного обеспечения. Объектный подход позволяет вести практически независимую разработку отдельных частей (объектов) программы. Кроме этого, объектный подход предлагает новые способы организации программ, основанные на механизмах инкапсуляции, наследования, полиморфизма, композиции, наполнения. Эти механизмы позволяют конструировать сложные классы из сравнительно простых классов. В результате существенно увеличивается показатель повторного использования кодов и появляется возможность создания библиотек объектов.
Разработка приложений операционной системы Windows и других оконных сред основывается на объектно-ориентированном подходе. Наибольшее распространение получили универсальные среды программирования для Windows Borland Delphi, Borland C++ Builder, Borland Developer Studio, Microsoft Visual Studio.
Четвертый этап развития технологий программирования начинается с середины 90-годов ХХ века и характеризуется применением компонентного подхода и CASE-технологий.
Компонентный подход предполагает построение программного обеспечения из отдельных компонентов физически отдельно существующих компонентов, которые взаимодействуют между собой через стандартизованные двоичные интерфейсы. В отличие от обычных объектов, объекты-компоненты можно собрать в динамически присоединяемые библиотеки или исполняемые файлы, распространять в двоичном виде (без исходных кодов) и использовать в любом языке программирования, поддерживающем соответствующую технологию. Это позволяет программистам многократно использовать готовые компоненты при разработке программ.
Компонентный подход лежит в основе технологий, разработанных на базе COM (Component Object Model – компонентная модельобъектов), и технологии создания распределённых приложений CORBA (Common Object Request Broker Architecture – общая архитектура с посредником обработки запросов объектов).
Технология СОМ фирмы Microsoft является развитием технологии OLE I (Object Linking and Embedding – связывание и внедрение объектов), которая использовалась в ранних версиях Windows для использования внутри документа, созданного одним приложением фрагментов, созданных другими приложениями. Технология СОМ определяет общие принципы взаимодействия программ любых типов, независимо от того, функционируют ли эти части в пределах одного процесса, в разных процессах на одном компьютере или на разных компьютерах. Модификация СОМ, обеспечивающая передачу вызовов между компьютерами, называется DCOM (Distributed COM – распределённая СОМ).
На базе технологии СОМ и её распределённой версии DCOM были разработаны многие популярные компонентные технологии создания программного обеспечения, например, OLE—automation, ActiveX.
Технология CORBA, разработанная группой компаний ОМС (Object Management Group – группа внедрения объектной технологии программирования), реализует подход, аналогичный СОМ, на базе объектов и интерфейсов CORBA. Программное ядро CORBA реализовано для всех основных аппаратных и программных платформ, поэтому эту технологию можно использовать для создания распределённого программного обеспечения в разнородной вычислительной среде. Организация взаимодействия между объектами клиента и сервера в CORBA осуществляется с помощью специального посредника, названного VisiBroker, и другого специализированного программного обеспечения.
Case -технологии – это технологии проектирования программ с помощью Case-средств или инструментов. Case расшифровывается как Computer-Aided Software/System Engineering –разработка программного обеспечения/программных систем с использованием компьютерной поддержки. Таким образом, эти компьютерные технологии автоматизации разработки программного обеспечения. Эти технологии применяются на всех этапах жизненного цикла программного обеспечения (стандарт ISO/IEC 12207:2008).
Обычно к CASE-средствам относят любое программное средство, автоматизирующее ту или иную совокупность процессов жизненного цикла ПО и обладающее следующими особенностями:
• мощные графические средства для описания и документирования ИС, обеспечивающие удобный интерфейс с разработчиком и развивающие его творческие возможности;
• интеграция отдельных компонент CASE-средств, обеспечивающая управляемость процессом разработки информационной системы;
• использование специальным образом организованного хранилища проектных метаданных (репозитория).
Интегрированное CASE-средство (или комплекс средств, поддерживающих полный жизненный цикл ПО) содержит следующие компоненты:
• репозиторий, являющийся основой CASE-средства. Он должен обеспечивать хранение версий проекта и его отдельных компонентов, синхронизацию поступления информации от различных разработчиков при групповой разработке, контроль метаданных на полноту и непротиворечивость;
• графические средства анализа и проектирования, обеспечивающие создание и редактирование иерархически связанных диаграмм (DFD, ERD и др.), образующих модели информационной системы;
• средства разработки приложений, включая алгоритмические языки и генераторы кодов;
• средства конфигурационного управления;
• средства документирования;
• средства тестирования;
• средства управления проектом;
• средства реинжиниринга.
2. О структурном и объектно-ориентированном
программировании
В курсе основ программирования вы убедились (во всяком случае, должны были убедиться), что грамотное программирование является структурным программированием.
Структурное программирование подразумевает:
• точно обозначенные управляющие (основные) структуры алгоритмов;
• соответствующее логике программы разбиение ее на программные блоки;
• автономные подпрограммы, в которых преимущественно используются локальные переменные;
• отсутствие (или, по крайней мере, ограниченное использование) операторов безусловного перехода – goto, break и др.
Последовательное применение концепций структурного программирования предполагает на каждом этапе проектирования программы разделение задачи на связанные между собой подзадачи, при этом программа разбивается на логически завершенные и стандартно кодируемые части. В результате код программы легко читается не только ее автором, но и другими программистами, и число ошибок при программировании существенно уменьшается. Естественно, преимущества структурного программирования наиболее ярко проявляются при написании больших программ, когда проектирование программы просто невозможно без разделения части. Но и при создании средних и малых программ структурный подход дает хорошие результаты.
Развитие программирования привело к новому подходу – объектно-ориентированному программированию (ООП). ООП, так же как и структурное программирование, предполагает разделение задачи на подзадачи, но при этом каждая подзадача становится самостоятельным объектом, содержащим свои коды и данные.
Объектно-ориентированный подход к программированию эффективен в тех случаях, когда некоторый реально существующий предмет характеризуется очень большим числом параметров. Тогда подпрограммы, описывающие алгоритмы обработки или функционирования такого предмета, имеют настолько большое число формальных параметров, что программирование их вызовов слишком трудоемко и сопряжено с большим количеством ошибок. Эффективным методом программирования таких задач является создания в программе объекта, соответствующего предмету. Этот объект будет включать в себя данные, соответствующие параметрам предмета, и подпрограммы (в Си++ функции), описывающие алгоритмы обработки или функционирования предмета. Данные объекта должными являться по умолчанию доступными для алгоритмов объекта (как бы быть глобальными для этих алгоритмов) и не включаться в списки параметров соответствующих подпрограмм. Таким образом, количество параметров подпрограмм существенно уменьшится.
Примером такого «предмета» с большим количеством параметров может служить окно приложения какой-либо оконной операционной системы, например, Windows. Подсчитайте, сколько параметров у окна приложения или окна папки!
3. Определение класса и объекта в C++
В С++ (и во многих других объектно-ориентированных алгоритмических языках, например, в Объектном Паскале) вводится новый тип данных – класс. Переменная типа класс называется объектом. Иногда объект называют также экземпляром класса. Формально описание класса напоминает структуру, но класс, кроме полей (переменных), содержит методы, которые задают допустимые действия над полями класса. Общее название для полей и методов – элементы класса.
Ниже дается простейшее описание класса на языке С++:
class имя_класса {
private:
описание личных элементов класса
public:
описание общих элементов класса
};
Под личными элементами класса (private) понимаются такие элементы, которые могут использоваться только методами своего класса. К общим элементам класса (public) доступ разрешен в любом месте программы. Существуют и другие способы доступа к элементам класса (см. лекцию 2).
Поля класса описываются внутри класса как обычные переменные. Методы – это функции, которые можно применять к полям. Считается хорошим стилем программирования, что внутри класса методы задаются своими прототипами. Вне класса (ниже его описания) приводится полное описание метода. Очень короткие методы можно полностью описывать внутри класса.
Как правило, поля являются личными элементами класса, т. е. доступ к полям разрешен только внутри методов класса. Это положение можно рассматривать как простейшую формулировку принципа инкапсуляции (см. лекцию 2).
Если внутри класса метод описан прототипом:
тип_результата имя_метода (список типов параметров),
то при полном описании вне класса метод имеет заголовок:
тип_результата имя_класса::имя_метода (список параметров),
т. е. в заголовке перед именем метода указывается имя класса (через знак ::).
Существуют особые методы класса: конструкторы и деструкторы. Назначение конструктора заключается в создании экземпляра класса и инициализации его полей. Имя конструктора совпадает с именем класса. Конструктор никогда не вызывается явно, его вызов осуществляется компилятором в момент создания экземпляра класса.
Деструктор вызывается для уничтожения экземпляра класса. Имя деструктора образуется как ~имя_класса. Деструктор может вызываться в программе явно или (что происходит обычно) его вызов обеспечивается компилятором в момент уничтожения экземпляра класса.
Наличие конструктора и деструктора для любого класса обязательно; при их отсутствии компилятор автоматически создает стандартные варианты конструктора и деструктора.
Экземпляры класса могут создаваться автоматически или динамически. Уничтожение автоматически созданных экземпляров классов происходит также автоматически при завершении выполнения блока функции, в котором они были определены. Определение (описание) автоматического экземпляра класса может встречаться в любом месте функции и имеет вид:
имя_класса имя_экземпляра(параметры конструктора);
Перед созданием динамического экземпляра класса (по аналогии с любыми динамическими переменными) необходимо объявить указатель на экземпляр:
имя_класса* указатель_на_экземпляр;
Динамический экземпляр класса создается с помощью оператора new, а уничтожается с помощью оператора delete:
указатель_на_экземпляр= new имя_класса (параметры конструктора);
delete указатель_на_экземпляр;
Метод класса (по аналогии с полем структуры) вызывается одним из следующих способов:
имя_экземпляра.имя_метода или имя_экземпляра->имя_метода
4. Пример консольной программы, использующей классы
Пример. Ниже приведена программа, в которой описан и используется класс cl_mas для обработки двумерных массивов. Кроме конструктора, класс содержит методы ввода матрицы, вычисления минимальных значений ее строк и вывода этих минимальных значений.
#include
#include
using namespace std;
class matr {private:
float **a;
int n,m;
char c;
float *min_str;
public:
matr(int n1, int m1,char c1);
void calc_min();
void vvod();
void vivod();
};
matr::matr(int n1, int m1, char c1)
{n=n1; m=m1; c=c1;
a=new float* [n];
int i,j;
for (i=0;ia[i][j])
min_str[i]=a[i][j];
}
}
void main()
{ matr *a, *b;
a=new matr(2,3,'a');
b=new matr(4,2,'b');
a->vvod();
b->vvod();
a->calc_min();
b->calc_min();
a->vivod();
b->vivod();
_getch();
delete a;
delete b;
}
Далее для сравнения приводится программа, выполняющая ту же задачу, что и предыдущая, но без использования классов, а с использованием классических функций Си. Сравните число параметров функций, выполняющих одинаковые алгоритмы, в этих двух программах.
#include
#include
void masout(float a[ ],int n,char c);/* то это шаблон функции вывода*/
/*первый размер у массивов-формальных параметров можно*/
/* не указывать, второй задан по максимуму*/
void matrin(float [ ][3],int n,int m,char c);/* c -имя матрицы*/
/* используется при выводе пояснительных фраз и приглашений*/
void minmatr(float [ ][3],int n,int m,float min[ ]);
/* n и m во всех функциях передаются по значению, т. к. их*/
/*фактические значения - константы*/
void main()
{float a[2][3],b[4][3], mina[2], minb[4];
matrin(a,2,3,'a'); matrin(b,4,2,'b');
minmatr(a,2,3,mina); minmatr(b,4,2,minb);
masout(mina,2,'a'); masout(minb,4,'b');
_getch();
}
void minmatr(float a[][3],int n,int m,float min[])
{int i,j;
for (i=0; i>a[i][j];
}
void masout(float a[],int n,char c)
{int i;
cout<<"Results for "<
Тебе могут подойти лекции
А давай сэкономим
твое время?
твое время?
Дарим 500 рублей на первый заказ,
а ты выбери эксперта и расслабься
Включи камеру на своем телефоне и наведи на Qr-код.
Кампус Хаб бот откроется на устройстве
Не ищи – спроси
у ChatGPT!
у ChatGPT!
Боты в Telegram ответят на учебные вопросы, решат задачу или найдут литературу
Попробовать в Telegram
Оставляя свои контактные данные и нажимая «Попробовать в Telegram», я соглашаюсь пройти процедуру
регистрации на Платформе, принимаю условия
Пользовательского соглашения
и
Политики конфиденциальности
в целях заключения соглашения.
Пишешь реферат?
Попробуй нейросеть, напиши уникальный реферат
с реальными источниками за 5 минут
с реальными источниками за 5 минут
Введение в объектно-ориентированное программирование на основе алгоритмического языка Си++
Хочу потратить еще 2 дня на работу и мне нужен только скопированный текст,
пришлите в ТГ