Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

«Основные понятия объектно-ориентированного программирования» (Понятие об объектно-ориентированном программировании)

Содержание:

ВВЕДЕНИЕ

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

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

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

Затем алгоритм выполняется на алгоритмическомязыке программирования– формальном языке для записи и реализации алгоритмов.

Объектом в курсовой работе выбран объектно-ориентированный язык программирования С++. Предметом работы являются основные понятия объектно-ориентированного программирования в языке С++.

Цель работы состоит в изучении основных понятий объектно-ориентированного программирования в языке С++.

Для достижения поставленной цели решены следующие задачи:

– рассмотреть основы объектно-ориентированного программирования;

– изучить структуру программ на языке С ++;

– изучить основные понятия объектно-ориентированного программирования в языке С++;

– выделить достоинства и недостатки объектно-ориентированного подхода.

ГЛАВА 1
ОСНОВЫ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПОДХОДА

1.1 Понятие об объектно-ориентированном программировании

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

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

Помимо объектов, ООП поддерживает различные функции, примеры которых приведены ниже[1,2]:

– классы;

– инкапсуляция;

– абстракция;

– наследование;

– полиморфизм.

Программы, написанные на ООП, используют классы и объекты, а также вышеуказанные функции. Язык программирования считается истинным объектно-ориентированным языком программирования, если все, что он представляет, использует объект. Например, Smalltalk – это язык, который является чисто объектно-ориентированным языком программирования.Язык программирования C ++, рассматриваемый в курсовой работе, называется частичным объектно-ориентированным языком программирования[2,3].

Язык C ++ был разработан в основном для использования объектно-ориентированных функций языка C.Хотя язык C ++ поддерживает такие функции ООП, как классы, объекты, наследование, инкапсуляция, абстракция и полиморфизм, существует несколько причин, по которым C ++ классифицируется как частичный объектно-ориентированный язык программирования.Некоторыепричины этогоприведены ниже[1,3].

1) Создание класса/объектов не является обязательным.

В C ++ функция main является обязательной и всегда находится вне класса. Следовательно, можно иметь только одну основную функцию в программе и обходиться без классов и объектов.Это первое нарушение чисто объектно-ориентированного языка программирования, где все представлено как объект.

2) Использование глобальных переменных.

В C ++ заложена концепция глобальных переменных, которые объявляются вне программы и могут быть доступны любому другому объекту программы. Это нарушает инкапсуляцию. Хотя C ++ поддерживает инкапсуляцию по отношению к классам и объектам, он не заботится об этом в случае глобальных переменных.

3) Наличие дружественной функции.

C ++ поддерживает класс или дружественную функцию, которые можно использовать для доступа к закрытым и защищенным элементам других классов, сделав их дружественными. Это еще одна особенность C ++, которая нарушает парадигму ООП.

1.2 Структура и способы описания языков программирования
высокого уровня

Для каждого языка программирования определены способы организации данных и действий над ними. Также выделяют понятие «элементы языка», которое состоит из множества символов (алфавита), лексем и других изобразительных средств языка программирования. Несмотря на большое количество языков, изучение их проходит примерно по одинаковой схеме. Связано это с общностью структуры разных языков программирования высокого уровня, показанной на рис. 1 [4].

Рис. 1. Структура языков программирования высокого уровня

Отметим сходство в изучении естественных языков и языков программирования. Основным знанием, для чтения и письма на иностранном языке, является его алфавит. Также необходимо знать правописание слов и правила записи предложений – синтаксис языка. И кроме этого необходимо понимать смысл слов и фраз для формирования соответствующей реакции. Например, зная правила чтения английского языка, можно правильно прочитать фразу, но смысл ее может остаться непонятным, анеобходимые действия не будут предприняты, т.е. смысловое содержание языковой конструкции, называемое семантикой, будет не понято.

Поэтому в любом языке программирования выделяют три основные составляющие – алфавит, синтаксис, семантику [5,6].

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

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

Для описания синтаксиса языка программирования также требуется какой–то язык. В этом случае речь идет о метаязыке, который предназначен для описания других языков. Наиболее известными метаязыками в программировании являются металингвистические формулы Бекуса–Наура (язык БНФ) и синтаксические диаграммы. Синтаксические диаграммы более наглядны и воспринимаютсялегче. Далее для удобства будем обращаться к отдельным элементам языка БНФ [4-6].

БНФ описывает все синтаксические понятия в виде формулы из трех частей – правой и левой частей, соединенных знаком ::=, смысл которого эквивалентен словам «по определению есть». Слева от знака ::= записывается имя определяемого понятия (метапеременная), которое заключается в угловые скобки <>, а в правой части записывается формула или диаграмма, определяющая все множество значений, которые может принимать метапеременная.

Описаниесинтаксиса языка выполняется последовательным усложнением понятий: вначале определяются базовые, а затем все более сложные, для которых предыдущие понятия являются составляющими.

В этой последовательности, конечным определяемым понятием является понятие программы [5,6].

1.3 Понятие объекта и класса

C++ – это язык программирования, поддерживающий несколько парадигм. Это означает, что он поддерживает разные стили программирования.

Одним из популярных способов решения задач программирования является создание объектов, известных как объектно-ориентированный стиль программирования.

C++ поддерживает объектно-ориентированный (ОО) стиль программирования, который позволяет разделять сложные задачи на простые путем создания объектов.

Объект – это набор данных и функций, которые управляют этими данными. Перед созданием объекта в C++ необходимо определить класс[7].

Класс является планом объекта. Можно описать класс как эскиз (прототип) дома. Он содержит все подробности об этажах, дверях, окнах и т.д. На основе этих описаний будет построен дом. Дом является объектом. По одному и тому же описанию можно построитьмного домов, т.е. создать много объектов одного класса.

Класс определяется в C++ с использованием ключевого слова «class», за которым следует имя класса. Тело класса находится внутри фигурных скобок и заканчивается точкой с запятой в конце. Например[7,8]:

classИмяКласса

{

// данные

// функции

};

Рассмотрим также другой пример, в котором определен класс под названием Test. Этот класс имеет два элемента данных: data1 и data2 и две функции: function1() и function2().

classTest

{

private:

int data1;

float data2;

public:

voidfunction1()

{ data1 = 2; }

floatfunction2()

{

data2 = 3.5;

returndata2;

}

};

Приведенный выше пример содержит два ключевых слова: private и public. Ключевое слово private делает данные и функции закрытыми. Закрытые данные и функции могут быть доступны только из одного класса.

Ключевое слово public делает данные и функции общедоступными. Публичные данные и функции могут быть доступны вне класса[8].

В примере data1 и data2 являются закрытыми объектами, тогда как функции function1() и function2() являются открытыми. Если попытаться получить доступ к закрытым данным вне класса, компилятор выдаст ошибку. Эта функция в ООП известна как скрытие данных.

При определении класса определяется только спецификация объекта, не выделяется ни память, ни хранилище. Для использования данных и функций доступа, определенных в классе, необходимо создать объекты[8].

Для определения объекта в C ++используется следующий синтаксис:

classNameobjectVariableName;

Рассмотрим пример создания объектов класса Test, определенных в примере выше[8,9]:

classTest

{

private:

int data1;

float data2;

public:

voidfunction1()

{ data1 = 4; }

floatfunction2()

{

data2 = 5.5;

return data2;

}

};

intmain()

{

Testt1, t2;

}

Здесь созданы объекты t1 и t2 класса Test. В приведенном классе Testdata1 и data2 являются элементами данных, а function1() и function2() – функциями данных.

Получить доступ к элементам данных и функциям можно с помощью оператора «.» (точка): t2.function1();

Это вызовет функцию function1() внутри класса Test для объекта t2.

К элементу данных можно получить доступ так: t1.data2 = 5.5;

Важно отметить, что к закрытым элементам можно получить доступ только из класса. Например, t2.function1 (); можно использовать из любой функции или класса в приведенном примере, а o1.data2 = 5,5; всегда должен быть внутри класса Test[7-9].

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

В ООП написание программ с помощью объектов очень похоже на работу с объектами реального мира. То есть объекты реального мира могут быть удобно представлены в программе, что уменьшает сложность программы, а также делает структуру программы понятной.

В объектно-ориентированных программах каждый объект представляет собой независимую и отдельную сущность, которая делает изменения, поиск и устранение проблем в программе легкой задачей. Кроме того, любые изменения, сделанные внутри класса, не влияют на другие части программы. Таким образом, объектно-ориентированные программы просты в написании и обслуживании[10].

В объектно-ориентированном программировании целостность данных и безопасность данных высоки, поскольку они сосредоточены на данных и их защите от манипуляций различными частями программы. В результате объектно-ориентированные программы менее подвержены ошибкам, более надежны и безопасны.

Объектно-ориентированные программы легко расширять, так как новые функции в программе можно легко добавлять, вводя несколько новых объектов без изменения существующих.

Объектно-ориентированное программирование позволяет повторно использовать код. То есть объекты, созданные в одной программе, могут быть повторно использованы в других программах. Кроме того, новые классы могут быть созданы с помощью существующих с использованием наследования. Это приводит к более быстрой разработке программного обеспечения и качественным программам.

Объектно-ориентированные программы легче адаптировать и масштабировать, то есть большая система может быть создана путем сборки повторно используемых подсистем.

В итоге можно сказать, что ООП – самая важная и гибкая парадигма современного программирования. Он особенно полезен при моделировании проблем реального мира и поэтому очень популярен.

Перечисленные преимущества ООП нашли широкое применение в следующих областях[10,11]:

  1. Симулирование и моделирование. Моделирование - это техника представления сущностей реального мира с помощью компьютерной программы.
  2. Проектирование пользовательского интерфейса. Другая популярная область применения ООП – разработка графических пользовательских интерфейсов. C ++ в основном используется для разработки пользовательских интерфейсов.
  3. Разработка компьютерных игр. ООП также используется для разработки компьютерных игр, таких как Diablo, Startcraft и Warcraft III. Эти игры предлагают среды виртуальной реальности, в которых множество объектов взаимодействуют друг с другом сложным образом, чтобы дать желаемый результат.
  4. Написание сценариев. В последние годы ООП также используется для разработки документов HTML, XHTML и XML для Интернета. Python, Ruby и Java являются языками сценариев, основанными на объектно-ориентированных принципах, которые используются для сценариев.
  5. Объектные базы данных. В наши дни концепции ООП также были внедрены в системы баз данных для разработки новой СУБД. Эти базы данных хранят данные непосредственно в виде объектов. Однако эти базы данных не так популярны, как традиционные СУБД.
  6. Некоторые другие области применения включают системы автоматизации делопроизводства, системы поддержки принятия решений, искусственный интеллект и экспертные системы, нейронные сети и параллельное программирование, а также системы автоматизированного проектирования.

Также отметим и недостатки объектно-ориентированного подхода. Существует несколько основных заблуждений, которые необходимо учитывать при рассмотрении использования объектно-ориентированного подхода [4]:

1. Объектно-ориентированная технология не является панацеей – объектно-ориентированная разработка лучше всего подходит для динамических интерактивных сред, о чем свидетельствует ее широкое распространение в системах CAD / CAM и инженерных системах проектирования.

Для крупномасштабных объектно-ориентированных корпоративных системы вопрос пока открыт, и многие приложения для информационных систем (например, начисления заработной платы, бухгалтерский учет) могут не получить выгоды от объектно-ориентированного подхода.

2. Отсутствует четкий переход от проектирования к реализации.

3. Объектно-ориентированная разработка еще не полностью принята крупными поставщиками, хотя имеет вес на рынке.

ГЛАВА 2
ОСНОВНЫЕ ПОНЯТИЯ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО
ПРОГРАММИРОВАНИЯ НА ЯЗЫКЕ С++

2.1 Базовая структура программы на С++

Программы представляют собой последовательность инструкций или утверждений. Эти операторы формируют структуру программы на C ++. Структура программы на C ++ разделена на различные разделы, а именно: заголовки, определения классов, определения функций-членов и основная функция.

Рис. 2.Составляющие программы на C ++

C ++ обеспечивает гибкость написания программы с определением класса или без него и его функций-членов. Простая программа на C ++ (без класса) включает комментарии, заголовки, пространство имен, main () и операторы ввода/вывода (рис. 3)[12,13].

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

Рис. 3. Структура программы на С ++ без классов

C ++ поддерживает два стиля комментариев: однострочный и многострочный. Однострочные комментарии используются для определения построчных описаний. Двойная косая черта (//) используется для представления однострочных комментариев. Чтобы понять концепцию однострочного комментария, рассмотрим его[13,14].

// Пример для демонстрации однострочного комментария. Он также может быть записан как

// Пример для демонстрации

// однострочного комментария

Многострочные комментарии используются для определения описания нескольких строк и представлены как / * * /. Рассмотрим следующий пример.

/ * Пример для демонстрации

многострочного комментария * /

Как правило, многострочные комментарии не используются в C ++, поскольку они требуют больше места в строке. Однако они полезны в операторах программы, где однострочные комментарии не могут быть использованы. Рассмотрим следующий пример[14].

for (int i = 0; i <10; // цикл выполняется 10 раз i ++)

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

for (int i = 0; i <10; / * цикл выполняется 10 раз * / i ++)

Как правило, программа включает в себя различные элементы программирования, такие как встроенные функции, классы, ключевые слова, константы, операторы и т. д., которые уже определены в стандартной библиотеке C ++. Чтобы использовать такие предопределенные элементы в программу должен быть включен соответствующий заголовок.Стандартные заголовки содержат такую информацию, как прототип, определение и тип возврата библиотечных функций, тип данных констант и т. д. В результате программистам не нужно явно объявлять (или определять) предопределенные элементы программирования[13,14].

Стандартные заголовки указываются в программе через директиву препроцессора #include. На рис.3использован заголовок iostream. Когда компилятор обрабатывает инструкцию # inc1ude <iostream>, он включает в себя содержимое iostream в программе. Это позволяет программисту использовать стандартные средства ввода, вывода и обработки ошибок, которые предоставляются только через стандартные потоки, определенные в <iostream>.

Эти стандартные потоки обрабатывают данные как поток символов, то есть данные считываются и отображаются в непрерывном потоке. К стандартным потокам, определенные в <iostream> относятся[15]:

  • cin: это стандартный поток ввода, который связан со стандартным устройством ввода (клавиатурой) и используется для получения данных пользователя.
  • cout: это стандартный поток вывода, который связан со стандартным устройством вывода (монитором) и используется для отображения вывода данных пользователя.
  • cerr: это стандартный поток ошибок, который связан со стандартным устройством вывода сообщений об ошибках (монитором) и используется для сообщения о них пользователю. Объект cerr не имеет буфера (области временного хранения) и, следовательно, немедленно сообщает об ошибках пользователям.
  • clog: это буферизованный поток ошибок, который связан со стандартным устройством вывода сообщений об ошибках (экран компьютера) и используется для сообщения о них пользователю. В отличие от cerr, clog сообщает об ошибках пользователю, только когда буфер заполнен.

В течение многих лет C ++ применял заголовки в стиле C, то есть расширение .h в заголовках. Однако в стандартной библиотеке C ++ появились заголовки нового стиля, включающие только имя заголовка. Следовательно, большинству компиляторов не требуется никаких расширений, хотя они поддерживают старое расширение .h. Некоторые из заголовков в стиле C и их эквиваленты на C ++ приведены на рис 4[12].

Рис.4. Соответствие заголовков в языкахС и С ++

Со времени своего создания C ++ претерпел множество изменений от Комитета по стандартам C ++. Одной из новых функций, добавленных к этому языку, является пространство имен.

Пространство имен позволяет группировать различные объекты, такие как классы, объекты, функции и различные токены C ++ и т. д., под одним именем[13,14].

Разные пользователи могут создавать отдельные пространства имен и, таким образом, могут использовать похожие имена объектов. Это позволяет избежать ошибок во время компиляции, которые могут возникнуть из-за конфликтов с одинаковыми именами.

Комитет по стандартам C ++ реорганизовал объекты стандартной библиотеки в пространство имен std. На рис.3оператор, использующий пространство имен std, информирует компилятор о включении всех сущностей, присутствующих в пространстве имен std. К сущностям пространства имен можно получить доступ следующими способами[14,15]:

  1. Указывая директиву using:

usingnamespacestd;

cout<<"Текст";

  1. Указав полное имя элемента:

std: :cout<<"Текст";

  1. Указав объявлениедирективы using:

usingstd:: cout;

cout<<"Текст";

Как только заголовок нового стиля включен, его содержимое включается в пространство имен std. Таким образом, все современные компиляторы C++ поддерживают данную запись:

#include<iostream>

usingnamespacestd;

Однако некоторые старые компиляторы могут не поддерживать эти операторы. В этом случае утверждения заменяются следующей записью#include<iostream.h>.

Main () – это функция, которая запускает выполнение программы на C++. Все операторы C ++, которые должны быть выполнены, написаны в main ()[12,14].

Компилятор выполняет все инструкции, написанные в открывающихся и закрывающихся фигурных скобках '{}', которые заключают тело main (). Как только все инструкции в main () выполнены, управление выходит из main (), завершая всю программу и возвращая значение операционной системе.

По умолчанию main () в C ++ возвращает значение int операционной системе. Следовательно, main () должен заканчиваться оператором return 0. Возвращаемое значение ноль указывает на успех, а ненулевое значение указывает на сбой или ошибку[14,15].

2.2 Базовая структура полной программы на C ++ с классами

Программа на C ++ может быть получена из базовой структуры. Общая структура программы C ++ с классами, которая также называется обзором, включает[11, 16]:

1. Раздел документации.

2. Директивы препроцессора или директивы компилятора.

2.1 Ссылки.

2.2 Область определения.

3. Областьобъявленияглобальных переменных.

4. Объявление класса.

5. Основная функция программы на C ++, называемая main ().

6. Начало программы –{ (левая скобка).

6.1 Объявление объекта.

6.2 Доступ к функциям-членам (с использованием оператора точки).

7. Конец основной программы – } (правая скобка).

Раздел «Документация» содержит заголовок и комментарии. Их назначение и описание приведены в подразделе 2.1.

Раздел директив препроцессора или директивы компилятора необязательный, но становится обязательным, если компилятор имеет подкаталоги INCLUDE и LIB.

Операторы компилятора бывают двух видов[12]:

  1. Операторы связи. Вданном разделе можно связать функции компилятора, такие как cout<<, cin>>, sqrt (), fmod (), sleep (), clrscr () и другие с помощью подкаталогаincludeс такими заголовочными файлами как iostream.h, conio.h, math.h, dos.h, string.h, ctype.h, process.h и т. д. Это становится очень полезным на этапе компиляции и компоновки. Общий синтаксис[11,15]:

#include<файл заголовка> или

#include "файл заголовка".

Рассмотрим пример:

#include <iostream.h>

#include <conio.h>

#include "dos.h"

В разделе определения вводятся переменные и их значения. Для этого используется оператор определения. Общий синтаксис: #define значение имени переменной. Рассмотрим пример:

#defineG 9.81

#defineA18

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

Объявление глобальной переменной может быть сделано следующим образом[16]:

тип данных vl,v2,v3………. vn;

В качестве типов данных могут выступать: int, float, char, double и т. д. vl, v2, v3, .... vn – список глобальных переменных (v). Рассмотрим пример некоторых допустимых операторов глобального объявления[14,15]:

Int a, b, c;

float x,y,z;

charch, name[10], address[20];

Область объявления класса представляет организацию данных и функций, которые работают с ними. Типы данных называются элементами данных, а функции называются функциями-членами. Комбинация элементов данных и функций-членов составляет объект данных или просто объект.

Синтаксис объявления класса выглядит следующим образом[15,17]:

class<имякласса>

{

private:

data members;

member functions ();

public:

data members;

member functions ();

protected:

data members;

member functions ();

};

main()

{

<name of class> obj1;

obj1.member function ();

obj1.member function();

getch();}

Class<имя класса> содержит имя, данное конкретному классу. Оно служит идентификатором, используя который можно создавать объекты.

Класс определяется ключевым словом class. Например: classDogs.

Характеристики класса описывают свойства типа данных. В классе можно объявить любое количество элементов данных любого типа. Например: floatarea;[16, 17]

С элементами данных класса могут выполняться различные операции. Можно объявить любое количество функций-членов любого типа в классе. Доступ к функциям-членам осуществляется с использованием объекта и оператора точки. Например: voidread(); voiddisplay();

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

Основная функция является main () – это то, где программа начинает выполнение. main () – это основная часть программы на C++, в которой обрабатываются операторы. Основная функция обычно организует на высоком уровне функциональность остальной части программы. Начинается основная программа с левой фигурной скобки – {.

Объекты класса могут быть объявлены внутри основной программы или вне ее. Объявление класса используется только для построения структуры объекта. Элементы данных и функции-члены объединяются в классе. Объявление объектов аналогично объявлению переменных базовых типов данных. Определение объектов типа данных класса известно как создание экземпляров класса. При создании объектов им выделяется память. Класс может содержать любое количество объектов[18].

Функция, определенная в классе, доступна с помощью оператора точки (.). Предположим, есть две функции класса voidread () и voiddisplay (). Необходимо получить доступ к этим функциям в основной программе.

Общий синтаксис: Obj1. Функция класса ();

Например: c1.read ();

Здесь c1 – это объект, а read () – функция класса.

Заканчивается основная программа правой фигурной скобкой – }.

Рассмотрим пример программы с классами, которая выполняет вычисление площади круга[19].

#include<iostream.h> // ссылки

#include<conio.h>// ссылки

#define PI 3.142 // область определения

float r; // область определения глобальных переменных

classCircle //определение класса Circle

{

private:

float area; // элемент данных

public:

void read() // функция класса

{

{

cout<"Enter the radius of the circle:";

cin>>r;

}

void display()

{

.area = PI * r*r;

Cout<< "Площадь круга равна" <<area;

}};

main () // главная программа

{ // начало главной программы

Circle c1;

c1.read();

c1.display();

getch();

} // конец главной программы

2.3 Наследование

Наследование является одной из ключевых особенностей объектно-ориентированного программирования на C ++. Это позволяет пользователю создавать новый класс (производный класс) из существующего класса (базовый класс). Производный класс наследует все функции от базового класса и может иметь свои собственные дополнительные функции[10].

Предположим, необходимо создать три персонажа – учитель математики, футболист и бизнесмен. Поскольку все персонажи – люди, они могут ходить и разговаривать. Тем не менее, они также имеют некоторые специальные навыки. Учитель математики может преподавать математику, футболист может играть в футбол, а бизнесмен может вести бизнес. Можно создать три разных класса, в каждом из которых, объект может ходить, разговаривать и выполнять свои специальные навыки, как показано на рис. 5[10, 11].

Рис. 5. Примеры классов

В каждом из классов нужно скопировать один и тот же код для действий перемещения и разговора. Если понадобится добавить новую функцию – например, есть, то нужно будет применить один и тот же код к каждому действующему лицу. Это может легко стать причиной ошибок (при копировании) и привести к дублированию кода. Будет проще, если создать класс Person с базовыми функциями, такими как «говорить», «ходить», «есть», «спать» и добавлять специальные навыки к этим функциям в соответствии с действующим лицом (рис. 6)[10, 11]. Выполнить это можно с помощью наследования.

Рис. 6. Схема наследования базовых действий

Используя наследование, можно не реализовывать один и тот же код для действий «ходить» и «говорить» для каждого класса. Их нужно унаследовать.

Таким образом, для учителя математики (производный класс) наследуются все функции Person (Человек) (базовый класс) и добавляется новая функция TeachMaths (Обучать математике). Аналогично, для футболиста наследуются все функции Person (Человек), и добавляется новая функция PlayFootball (Играет в футбол) и так далее. Это делает код понятным и расширяемым[12].

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

В общем виде код для рассмотренного примера имеет следующий вид[10, 11]:

class Person

{

... .. ...

};

classMathsTeacher : public Person

{

... .. ...

};

classFootballer : publicPerson

{

.... .. ...

};

В приведенном выше примере класс Person (Человек) является базовымклассом, а классы MathsTeacher (Учитель математики) и Footballer (Футболист) являются производными от Person (Человек).

Производный класс отображается с объявлением класса, за которым следует двоеточие, ключевое слово public и имя базового класса, из которого он получен[10-12].

Поскольку MathsTeacher (Учитель математики) и Footballer (Футболист) являются производными от Person (Человек), то все элементы данных и функции Person (Человек) могут быть доступны из них.

Код для базового класса Person (Человек) имеет вид:

classPerson

{

public:

string profession;

int age;

Person(): profession("profession"), age(age) { }

voiddisplay()

{

cout<<"My profession is: "<< profession <<endl;

cout<<"My age is: "<< age <<endl;

walk();

talk();

}

voidwalk(){ cout<<"I can walk."<<endl; }

voidtalk(){ cout<<"I can talk."<<endl; }

};

Код для производных классов MathsTeacher (Учитель математики) и Footballer (Футболист) имеет вид:

classMathsTeacher :public Person

{

public:

voidteachMaths(){ cout<<"I can teach Maths."<<endl; }

};

classFootballer :public Person

{

public:

voidplayFootball(){ cout<<"I can play Football."<<endl; }

};

В классе Person (Человек) два элемента – профессия и возраст. Он также содержит две функции – walk () (ходить) и talk () (говорить).

Тем не менее, MathsTeacher (Учитель математики) и Footballer (Футболист) также содержат свои собственные функции: teachMaths () и playFootball () соответственно. Эти функции доступны только их собственному классу.

2.4 Инкапсуляция

Инкапсуляцию можно определить как метод, в котором данные и функции объединяются внутри класса. Этот процесс скрывает данные, а также защищает их от доступа извне или постороннего пользователя. Чтобы получить к нему доступ, пользователь должен пройти через функции в классе.

Инкапсуляция – это концепция объектно-ориентированного программирования, которая связывает данные и функции вместе, манипулируя данными, и в конечном итоге обеспечивает защиту данных и функций от внешнего мира[10, 11].

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

Приведем пример инкапсуляции, в котором вычисляется объем контейнера[14].

class Box

{

public:

doublegetVolume(void)

{

return length * breadth * height;

}

private:

double length; // длина

double breadth; // ширина

doubleheight; // высота

};

Это означает, что доступ к элементам класса Box ограничен. Тем самым достигается инкапсуляция. Чтобы сделать их доступными для других участников, их нужно объявить открытыми.

Программа на C ++, в которой реализован класс с открытыми и закрытыми элементами, является примером инкапсуляции и абстракции данных[14,15].

#include<iostream.h>

classAdder{

public:

//эта часть программы доступна всем

Adder(int x = 0)

{

total = x;

}

// этотинтерфейсдоступенизвне

voidaddNum(int no)

{

total += no;

}

intgetTotal()

{

return total;

};

private:

// начиная отсюда данные скрыты

inttotal;

};

int main( )

{

Adder y;

y.addNum(10);

y.addNum(20);

y.addNum(30);

cout<< "Total " <<y.getTotal() <<endl;

return 0;

}

2.5 Абстракция

Абстракция данных может рассматриваться как процесс показа только существенной части программы внешнему миру и сокрытия деталей. Это процесс представления только необходимой информации в рамках программы и опущения деталей. Абстрагирование данных может также рассматриваться как процесс или метод, используемый для разделения интерфейса и реализации[10,12].

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

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

В терминах C ++ классы используются для обеспечения желаемого уровня абстракции данных.

Понятия инкапсуляции и абстракции очень важны в концепции объектно-ориентированного программирования и в какой-то мере взаимосвязаны. Рассмотрим разницу между ними[12].

Инкапсуляция предполагает скрытие чего-то как в капсуле. Поэтому это больше похоже на упаковку или просто скрытие методов и свойств.

Программисты используют инкапсуляцию для скрытия данных и кодов в одном модуле с целью их защиты от внешнего мира.

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

Инкапсуляция осуществляется с помощью модификаторов защищенного и закрытого доступа, а абстракция – с использованием абстрактного класса и интерфейса[10, 14].

Целостность обеспечивается в ООП с помощью инкапсуляции (то есть обеспечения надлежащего использования данных и надлежащим образом), это достигается путем предотвращения непреднамеренного доступа программистов к данным.

Отличия также поясняет пример.

Примеринкапсуляции:

Class Encapsulation

{

Private float division;

Public float division

{

get { return division; }

set {division = value;}

}

}

Примерабстракции:

abstract class Abstraction

{

public abstract void do Abstraction();

}

public class AbstractionImpl: Abstraction

{

public void doAbstraction()

{

// its Implemented it

}

}

2.6 Полиморфизм

В 1967 году Кристофером Стрейчи идентифицировал полиморфизм, а Хиндли и Милнер позже разработали это понятие. Важнымявляется не понимание реализации, а то, как работает сама концепция.

Полиморфизм – это особенность ООП, которая позволяет объекту вести себя по-разному в разных условиях. В C ++ есть два типа полиморфизма[12, 16]:

1) Полиморфизм времени компиляции – также известен как статическое (или раннее) связывание.

2) Полиморфизм времени исполнения – также известен как динамическое (или позднее) связывание.

Перегрузка функций и перегрузка операторов являются прекрасным примером полиморфизма времени компиляции.

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

Пример полиморфизма времени компиляции[11,16]:

#include<iostream>

using namespace std;

class Add {

public:

int sum(int num1, int num2){

return num1+num2;

}

int sum(int num1, int num2, int num3){

return num1+num2+num3;

}

};

int main() {

Add obj;

//Вызовпервойфункции

cout<<"Output: "<<obj.sum(10, 20)<<endl;

// Вызоввторойфункции

cout<<"Output: "<<obj.sum(11, 22, 33);

return 0;

}

На выходе получим:

Output: 30

Output: 66

В зависимости от количества слагаемых будет вызвана соответствующая функция sum. Так, в первом случае будут просуммированы два числа, во втором – три.

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

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

Пример полиморфизма времени выполнения:

#include<iostream>

using namespace std;

class A {

public:

voiddisp(){

cout<<"Super Class Function"<<endl;

}

};

class B: public A{

public:

voiddisp(){

cout<<"Sub Class Function";

}

};

int main() {

//Parent class object

Aobj;

obj.disp();

//Child class object

B obj2;

obj2.disp();

return 0;

}

На выходе получим:

SuperClassFunction

SubClassFunction

ЗАКЛЮЧЕНИЕ

Интенсивное развитие области программного обеспеченияпривело к тому, что некоторые аспекты его разработки меняются и совершенствуются. Разработанный еще в конце прошлого века объектно-ориентированныйподход, ежедневно применяется в различных областях.

Несмотря на то, что сегодня широкое распространение получили такиеобъектно-ориентированные языки программирования как Javaи C#, С++ остается востребованным.

Тот факт, что С++ не является чистым объектно-ориентированным языком программирования можно воспринимать как возможность «2 в 1» для программиста. То есть можно научится писать программы, используя и структурное и объектное программирование.

В данной курсовой работе были рассмотрены ключевые понятия объектно-ориентированного программирования: объекты, классы, инкапсуляция, наследование, полиморфизм. Изложенный теоретический материал проработан на примерах, написанных на языке С ++.

В результате проведенного анализа выделены преимущества и недостатки языка С ++, а также определены области его применения.

БИБЛИОГРАФИЯ

  1. Ашарина И.В. Объектно-ориентированное программирование вС++: лекции и упражнения: Учебное пособие для вузов / И.В. Ашарина.
    – М.: РиС, 2015. – 336 c.
  2. What is object-oriented programming (OOP)? [Электронный ресурс] / URL: https://www.tutorialspoint.com/What-is-object-oriented-programming-OOP (дата обращения: 22.07.2020).
  3. Основы объектно-ориентированного проектирования Интуит [Электронный ресурс] / URL: https://www.intuit.ru/studies/courses/72/72/info (дата обращения: 22.07.2020).
  4. Ипатова Э. Р. Методологии и технологии системного проектирования информационных систем / Э.Р. Ипатова, Ю.В. Ипатов. – М.: Флинта, 2016. – 256 c.
  5. Мидоу Ч. Анализ информационных систем: моногр. / Ч. Мидоу.
    – М.: Прогресс, 2015. – 400 c.
  6. Слепцов А.И. Автоматизация проектирования управляющих систем гибких автоматизированных производств / А.И. Слепцов, А.А. Юрасов. – М.: Техника, 2015. – 110 c.
  7. Павловская Т. С/С++. Процедурное и объектно-ориентированное программирование / Т. Павловская. – СПб.: Питер, 2018. – 496 c.
  8. Хорев П.Б. Объектно-ориентированное программирование / П.Б. Хорев. – М.: Academia, 2018. – 352 c.
  9. Introduction-to-Object-Oriented-Programming-Concep [Электронныйресурс] / URL: https://www.codeproject.com/Articles/22769/Introduction-to-Object-Oriented-Programming-Concep (датаобращения: 22.07.2020).
  10. Four-basic-principles-of-object-oriented-programming [Электронныйресурс] / URL: https://medium.com/@cancerian0684/what-are-four-basic-principles-of-object-oriented-programming-645af8b43727 (датаобращения: 24.07.2020).
  11. C++ Object Oriented programming Concepts [Электронныйресурс] / URL: https://www.studytonight.com/cpp/cpp-and-oops-concepts.php(датаобращения: 25.07.2020).
  12. Сlasses-oop [Электронный ресурс] / URL: https://brilliant.org/wiki/classes-oop/ (дата обращения: 23.07.2020).
  13. Ашарина И.В. Язык С++ и объектно-ориентированное программирование в С++. Лабораторный практикум: Учебное пособие для вузов / И.В. Ашарина, Ж.Ф. Крупская. – М.: ГЛТ , 2015. – 232 c.
  14. Васильев А.Н. Объектно-ориентированное программирование на C++ / А.Н. Васильев. – СПб.: Наука и техника, 2016. – 544 c.
  15. DescriptionoftheC++ language [Электронный ресурс] / URL: http://www.cplusplus.com/info/description/ (дата обращения: 22.07.2020).
  16. Лафоре Р. Объектно-ориентированное программирование в С++ /
    Р. Лафоре. – СПб.: Питер, 2018. – 928 c.
  17. Хорев П.Б. Объектно-ориентированное программирование: Учебное пособие / П.Б. Хорев. – М.: Академия, 2018. – 384 c.
  18. Уйманова Н. А. Основы объектно-ориентированного проектирования / Н. А. Уйманова. – ОГУ, 2017. – 156 с.
  19. Мейер Б. Основы объектно-ориентированного программирования / Б. Мейер. – М.: НОУ "Интуит", 2016. – 970 с.