Основные понятия объектно-ориентированного программирования справочник с примерами на С++. Учебно-методическое пособие
.pdfМинистерство цифрового развития, связи и массовых коммуникаций Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Сибирский государственный университет телекоммуникаций и информатики» (СибГУТИ)
Е. И. Ситняковская, Е. В. Янченко
Основные понятия объектно-ориентированного программирования: справочник с примерами на С++
Учебно-методическое пособие
Новосибирск
2024
УДК 004.4(075.8)
Утверждено редакционно-издательским советом СибГУТИ
Рецензент канд. техн. наук, доцент СибГУТИ О.И. Моренкова
Ситняковская, Е. И. Основные понятия объектно-ориентированного программирования: справочник с примерами на С++ : учебно-методическое пособие / Е. И. Ситняковская, Е. В. Янченко ; Сибирский государственный университет телекоммуникаций и информатики, кафедра прикладной математики и кибернетики. – Новосибирск, 2024. – 27 с.
Учебно-методическое пособие предназначено для студентов, изучающих дисциплину «Объектно-ориентированное программирование» в соответствии с программой подготовки бакалавров по направлению 09.03.01 «Информатика и вычислительная техника» профиля «Программное обеспечение средств вычислительной техники и автоматизированных систем».
Пособие содержит теоретическое краткое описание базовых технологий объектно-ориентированного программирования с примерами синтаксиса и программ на языке С++ и может быть полезно при выполнении заданий на практических занятиях.
©Ситняковская Е.И., Янченко Е.В., 2024
©Сибирский государственный университет телекоммуникаций и информатики, 2024
2
|
|
Содержание |
|
ВВЕДЕНИЕ .................................................................................................................. |
4 |
||
1 |
Основные принципы ООП: инкапсуляция, наследование, полиморфизм ...... |
5 |
|
2 |
Классы и объекты .................................................................................................. |
6 |
|
3 |
Конструкторы, деструкторы................................................................................. |
8 |
|
4 |
Доступность компонентов класса ...................................................................... |
12 |
|
5 |
Наследование. Иерархия классов....................................................................... |
13 |
|
6 |
Методы – элементы класса ................................................................................. |
15 |
|
|
6.1 |
ОПРЕДЕЛЕНИЕ И ДОСТУП ...................................................................................................... |
15 |
|
6.2 |
СОКРЫТИЕ МЕТОДОВ БАЗОВОГО КЛАССА ............................................................................. |
15 |
|
6.3 |
КЛЮЧЕВОЕ СЛОВО THIS ........................................................................................................ |
16 |
|
6.4 |
СТАТИЧЕСКИЕ МЕТОДЫ КЛАССА .......................................................................................... |
17 |
|
6.5 |
РАННЕЕ И ПОЗДНЕЕ СВЯЗЫВАНИЕ. ВИРТУАЛЬНЫЕ МЕТОДЫ ................................................ |
17 |
7 |
Абстрактные классы............................................................................................ |
23 |
|
ЗАКЛЮЧЕНИЕ ......................................................................................................... |
25 |
||
ЛИТЕРАТУРА ........................................................................................................... |
26 |
||
3
ВВЕДЕНИЕ
Дисциплина «Объектно-ориентированное программирование» является базовой в процессе подготовки специалистов по разработке программного обеспечения для вычислительных систем. Изучение базовых технологий объ- ектно-ориентированного программирования (далее – ООП) в рамках данной дисциплины значительно облегчит изучение некоторых других дисциплин из учебного плана по направлению 09.03.01 «Информатика и вычислительная техника» профиля «Программное обеспечение средств вычислительной техники и автоматизированных систем», связанных с разработкой программного обеспечения, в том числе и для мобильных устройств.
Пособие может быть полезно при выполении практических заданий. Оно позволяет: быстро найти требуемую технологию, получить краткую теоретическую справку, посмотреть синтаксис, выполнить и проанализировать предложенный пример программы для закрепления материала.
4
1 Основные принципы ООП: инкапсуляция, наследование, полиморфизм
Инкапсуляция – механизм скрытия данных внутри объекта. Пользователь класса может работать с закрытыми компонентами (с доступом private) через интерфейс класс, т.е. через публичные (с доступом public) свойства и методы класса. Закрывать данные от внешнего вмешательства и некорректного использования стало возможным благодаря типу данных особого вида – классу, объединяющего поля данных, в виде переменных разных типов, и методов обработки данных, в виде функций.
Наследование – конструирование новых, более сложных производных классов-потомков, из уже имеющихся базовых классов-родителей, с помощью добавления новых полей и/или методов.
Наследование позволяет новым классам (производным) использовать все компоненты, весь код, которые были созданы и отлажены в базовых классах. Такая возможность экономит время на написание и отладку кода.
Можно сказать, что процесс наследования – это процесс построения иерархии классов.
Полиморфизм – механизм, обеспечивающий возможность определения различных описаний некоторого единого метода (единого по названию) для классов различного уровня иерархии. Т.е. одноименные функции могут иметь разные реализации. Главный принцип полиморфизма: один интерфейс – множество методов.
Например, при построении иерархии классов графических фигур можно в каждый класс добавить метод «Рассчитать площадь». Имя метода будет одинаковое, а реализация в каждом классе разная. В текущий момент работы программы метод «Рассчитать площадь» будет вызываться из того класса, объект которого используется при вызове данного метода.
Перегрузку функций (определение нескольких функций с одинаковым именем в
одной области видимости) можно также считать одним из проявлений полиморфизма.
Вопросы для самоконтроля
1.Объясните принцип инкапсуляции.
2.Какова польза от применения наследования?
3.Полиморфизм: в чем преимущество, как проявляется?
5
2 Классы и объекты
В ООП представление данных в программе и их взаимодействие имеет свои ограничения.
Класс – это произвольный структурированный тип, введённый на основе уже существующих типов. Определение классов в общем случае похоже на определение структуры, т.к. структура является частным случаем класса:
сlass имя_класса { список_компонентов };
Определение класса должно располагаться в глобальной области. Класс может быть определён и внутри тела функции – локальный класс, но тогда он виден только в той области, где определен.
Класс может содержать в себе следующие основные виды компонентов:
1)данные (константы, переменные);
2)методы (функции);
3)свойства (механизм работы с данными);
4)конструкторы, деструкторы (специальные функции класса);
5)операции (функции - операции).
Список компонентов называется телом класса. Принадлежащие классу функции называются методами. Данные класса называют полями данных.
Так как класс является типом данных, то он служит для определения объектов:
имя_класса имя_объекта;
Обращение к компонентам объекта:
имя_объекта. имя_компонента
Вызов методов:
имя_объекта.имя_функции();
К компонентам объекта класса можно обращаться с помощью «квалифи-
цированных» имен (например, для вызова метода базового класса):
имя_объекта.имя_класса :: имя_функции();
При определении класса можно задать статический компонент. Статические компоненты создаются в единственном экземпляре для всех объектов класса.
сlass имя_класса {
static тип_данных имя_компонента;
};
Для инициализации статического компонента используется конструкция, расположенная в глобальной области после определения класса:
тип_данных имя_класса::имя_компонента = значение;
6
При работе с классами возможно создание массивов объектов.
Для создания массива объектов в стековой памяти будет использована следующая структура:
имя_класса имя_массива_объектов[количество_объектов];
Работа с полями объекта будет выглядеть так:
имя_массива_объектов[номер_объекта].имя_компонента = значение;
При таком способе создания массива нет возможности в процессе выполнения программы изменять его размер или удалять массив. Это так называемый статический массив.
Если для работы требуются динамические массивы, т.е. у которых можно изменять размер, удалять в процессе работы программы, то их нужно создавать
в куче (динамически распределяемая область оперативной памяти):
имя_класса *имя_указателя = new имя_класса [количество_объектов];
Вопросы для самоконтроля
1.В терминологии ООП: класс – это?
2.В терминологии ООП: объект – это?
3.Поля данных – что это?
4.Методы класса – это?
5.Запишите общую форму записи создания объекта класса?
6.Запишите общую форму записи вызова метода класса?
7
3 Конструкторы, деструкторы
Конструктор класса
Для инициализации объектов любого класса существует специальный метод, принадлежащий классу и имеющий вид:
имя_класса (список_формальных_параметров) { операторы_тела_конструктора;
};
Класс, содержащий конструктор без параметров, будет иметь вид:
имя_класса { тип_компонента_класса имя_компонента_класса1;
...
имя_класса () { имя_компонента_класса1= значение;
};
};
Обратите внимание, что имя класса и имя конструктора класса должны совпадать. Для конструктора не определяется тип возвращаемого значения в соответствии с синтаксисом.
Конструктор класса будет автоматически вызываться при определении объекта или его размещении в памяти с помощью new. Если не указывать явно конструктор, то он создается автоматически без параметров.
Конструктор по умолчанию – конструктор, который может быть вызван без аргументов.
В списке формальных параметров можно задать значения по умолчанию. При автоматическом вызове используются значения параметров по умолчанию.
имя_класса { тип_компонента_класса имя_компонента_класса1;
...
имя_класса (тип_параметра параметр1=значение по умолчанию, …) { имя_компонента_класса1= параметр1;
};
};
В конструкторе можно изменять значения инициализированного статического компонента.
Рассмотрим задание параметров по умолчанию в конструкторе на примере комплексных чисел:
8
#include <iostream> #include <iomanip>
using namespace std;
class complex1 {
float a; //вещественная часть float b; //мнимая часть
public:
complex1(float a1 = 0.0, float b1 = 0.0) {
//конструктор, принимающий значения вещественной и мнимой //частей, по умолчанию равных 0.0
a = a1; b = b1;
}
void display(void) { cout << fixed; cout.precision(6);
cout<<a<<"+i*"<<b<<endl;
}
};
int main()
{
complex1 x; x.display(); complex1 y(5); y.display(); complex1 z(6,7); z.display();
}
Вывод:
0.000000+i*0.000000
5.000000+i*0.000000
6.000000+i*7.000000
В классе может быть несколько конструкторов, это называется перегрузкой. При перегрузке нужный конструктор будет вызываться самостоятельно в зависимости от параметров, используемых при инициализации. И только один конструктор может содержать аргументы по умолчанию для всех параметров.
При работе с конструктором есть несколько ограничений:
1)нельзя получить его адрес;
2)параметрами не может быть собственный класс, но может быть ссылка на него;
3)нельзя вызывать конструктор как обычную компонентную функцию (метод класса).
Для явного вызова конструктора используют конструкцию:
имя_класса имя_объекта(параметры);
9
В рассмотренном ранее примере с комплексными числами мы использовали способ инициализации конструктора с помощью передачи значения параметров в тело конструктора. Существует еще один способ инициализации с помощью списка инициализаторов данных объекта – конструктор с параметрами. При таком способе инициализации конструктор будет иметь вид:
имя_класса (список_формальных_параметров) :список_инициализаторов_данных{ Операторы_тела_конструктора;
};
Для комплексных чисел конструктор примет вид:
complex1(float a1 = 0.0, float b1 = 0.0) : a(a1), b(b1) { };
Выражение инициализации, заключенное в круглые скобки, может содержать не только значение, как в примере выше, но и различные операции, допустимые для данного типа данных.
Конструкторы с параметрами удобны при наследовании, так как они позволяют не прописывать их логику, если она была уже реализована в родителе.
Деструктор класса
При вызове конструктора может выделяться динамическая память, поэтому есть необходимость высвобождать память, если класс перестает быть нужным. Для высвобождения памяти используется специальная функция – деструктор класса. Деструктор имеет вид:
~имя_класса () {операторы_тела_деструктора};
Название деструктора всегда начинается с символа ~(тильда). Деструктор не может иметь возвращаемое значение. Вызов деструктора совершается неявно, когда объект класса уничтожается.
Деструкторы базовых классов выполняются в порядке, обратном перечислению классов в определении производного класса.
Вопросы для самоконтроля
1.Что такое конструктор класса? Особенность объявления, назначение?
2.В какой момент работы программы срабатывает конструктор?
3.В классе может быть несколько конструкторов?
4.Каковы ограничения при работе с конструктором?
5.Способы инициализации полей данных класса?
6.Что такое деструктор класса? Особенность объявления, назначение?
10
