Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Основные понятия объектно-ориентированного программирования справочник с примерами на С++. Учебно-методическое пособие

.pdf
Скачиваний:
0
Добавлен:
09.08.2026
Размер:
384 Кб
Скачать

Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации

Федеральное государственное бюджетное образовательное учреждение высшего образования

«Сибирский государственный университет телекоммуникаций и информатики» (СибГУТИ)

Е. И. Ситняковская, Е. В. Янченко

Основные понятия объектно-ориентированного программирования: справочник с примерами на С++

Учебно-методическое пособие

Новосибирск

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]