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

книги / Технологии разработки объектно-ориентированных программ на язык C++. Основы объектно-ориентированного программирования на алгоритмическом языке C++

.pdf
Скачиваний:
7
Добавлен:
12.11.2023
Размер:
876.09 Кб
Скачать

Министерство науки и высшего образования Российской Федерации

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

«Пермский национальный исследовательский политехнический университет»

О.А. Полякова, О.Л. Викентьева

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

В двух частях

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

Утверждено Редакционно-издательским советом университета

в качестве учебного пособия

Издательство Пермского национального исследовательского

политехнического университета

2019

1

ББК 004.438(075.8) УДК 004.438(075.8)

П12

Рецензенты д-р экон. наук, проф. Р.А. Файзрахманов

(Пермский национальный исследовательский политехнический университет)

д-р пед. наук, проф. Е.Г. Плотникова (Пермский филиал Национального исследовательного

университета «Высшая школа экономики»)

Полякова, О.А.

П12 Технологии разработки объектно-ориентированных программ на языке С++ : учеб. пособие : в 2 ч. / О.А. Полякова, О.Л. Викентьева. – Пермь : Изд-во Перм. нац. исслед. политехн. ун-та, 2019.

ISBN 978-5-398-02186-8

Ч. II. Основы объектно-ориентированного программирования на алгоритмическом языке С++. – 61 с.

ISBN 978-5-398-02188-2

Рассмотрены вопросы применения основных принципов объектноориентированного программирования в сложных программных системах на языке высокого уровня С++, которые демонстрируются на содержательных примерах. Разработано в сотрудничестве с авторским коллективом студентов группы РИС 17-1б: Е. Бартовым, А. Граничниковой, Н. Ерохиным, Е. Селиверстовым, М. Торопицыным, Р. Шириновым.

Предназначено для студентов направлений: 09.03.01 – «Информатика и вычислительная техника»; 09.03.04 – «Программная инженерия»; 10.05.03 – «Обеспечение информационной безопасности распределенных информационных систем»; 15.03.04 – «Автоматизация технологических процессов и устройств»; 27.03.04 – «Управление и информатика в технических системах»; 38.03.05 – «Бизнес – Информатика».

 

ББК 004.438(075.8)

 

УДК 004.438(075.8)

ISBN 978-5-398-02188-2 (ч. II)

 

ISBN 978-5-398-02186-8

© ПНИПУ, 2019

2

ОГЛАВЛЕНИЕ

 

Глава 16. Классы в С++

 

16.1. Объектно-ориентированное программирование в С++

........ 5

16.2. Классы и объекты в ООП ........................................................

5

16.3. Определение класса. Управление доступом..........................

6

16.4. Внутренний и внешний интерфейс.........................................

6

16.5. От сокрытия данных к инкапсуляции.....................................

8

16.6. Реализация функций – членов класса.....................................

8

16.7. Конструктор и деструктор.....................................................

10

16.8. Указатель this ..........................................................................

11

16.9. Понятие полиморфизма.........................................................

13

Глава 17. Работа с классами

 

17.1. Перегрузка операций..............................................................

14

17.2. Друзья классов........................................................................

15

17.3. Функции преобразования ......................................................

17

17.4. Статические члены класса.....................................................

20

17.5. Конструктор копирования и операция присваивания.........

21

17.6. Список инициализаторов – членов класса...........................

23

Глава 18. Наследование классов

 

18.1. Основы наследования ............................................................

25

18.2. Конструкторы и деструкторы при наследовании................

26

18.3. Полиморфное открытое наследование.................................

28

18.4. Статическое и динамическое связывание............................

28

18.5. Абстрактные базовые классы................................................

29

18.6. Множественное наследование ..............................................

30

18.7. Закрытое и защищенное наследование классов..................

31

18.8. Доступ к методам и объектам базового класса

 

при закрытом наследовании...........................................................

32

Глава 19. Шаблоны классов.................................................................

34

19.1. Определение шаблона класса................................................

34

19.2. Параметры шаблона...............................................................

36

19.3. Универсальность шаблонов...................................................

37

3

Глава 20. Исключения..........................................................................

38

20.1. Механизм исключений ..........................................................

38

20.2. Потеря исключений................................................................

39

20.3. Класс exception .......................................................................

40

Глава 21. Поиск данных с помощью хеш-таблиц..............................

42

21.1. Понятие хеширования............................................................

42

21.2. Реализация хеш-таблицы и выбор хеш-функции................

44

21.3. Разрешение коллизий.............................................................

49

21.4. Алгоритмы хеширования.......................................................

53

21.5. Виды хеширования.................................................................

57

Список литературы...............................................................................

59

4

Глава 16. КЛАССЫ В С++

16.1. Объектно-ориентированное программирование в С++

Объектно-ориентированное программирование – это методо-

логия программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса.

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

Пример:

Класс «автомобиль», объектом которого является машина «Волга», имеющая мощность 95 лошадиных сил, черного цвета (имя, мощность, цвет являются данными, присущими экземпляру класса автомобиль). У этого экземпляра есть некое поведение: автомобиль может ехать, поворачивать, тормозить.

16.2. Классы и объекты в ООП

Класс является описанием абстрактного типа данных, кото-

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

Объект является переменной этого класса со своими, присущими только ему, данными.

Класс содержит две части: поля(свойства) ифункции (методы).

Поля и методы называются элементами или членами класса. Например, в классе автомобиль полями являются марка, модель, номер, год выпуска, мощность и цвет, а методами – ехать, поворачивать, тормозить. Конкретный автомобиль «Форд Фокус» с номером К345ВМ59, выпущенный в 2017 г., с мощностью двигателя 125 л.с., черного цвета является объектом класса автомобиль.

5

16.3. Определение класса. Управление доступом

Рассмотрим стандартное описание класса:

сlass «имя» { private:

«описание скрытых членов» public:

«описание открытых членов» protected:

«описание защищенных членов»

};

public, private, protected – модификаторы доступа, они управляют доступом к членам класса:

public описывает открытый раздел класса. К данным и методам

вэтом разделе можно обращаться как изнутри, так и снаружи объекта этого класса. Этотразделобразует«внешний» интерфейскласса;

protected будет рассмотрен далее;

private описывает закрытый (приватный) раздел класса. К данным и методам в этом разделе можно обращаться только изнутри объекта этого класса. Эта изоляция данных со стороны программы называется сокрытием данных и образует «внутренний» интерфейс класса.

Действие любого модификатора доступа распространяется до следующего модификатора или до конца класса. Поля класса имеют любой тип, кроме типа класса, которому они принадлежат.

16.4. Внутренний и внешний интерфейсы

Одним из основных принципов парадигмы ООП является понятие внешнего и внутреннего интерфейсов. Рассмотрим в качестве примера внутреннего и внешнего интерфейсов объект «кофеварка» (рис. 16.1). Снаружи это кнопки, индикаторы, отверстия. Изнутри – множество деталей, которые не видны пользователю. Секрет надежности и простоты кофеварки в том, что все детали спрятаны внутри и работают совместно.

6

Если снять с кофеварки защитный кожух, то использование ее будет более сложным (куда нажимать?) и опасным (может ударить током). Таким образом, внешний интерфейс всегда простой и понятный для пользователя. Внутренний интерфейс обычно состоит из множества связанных между собой деталей и является достаточно сложным для пользователя.

Рис. 16.1. Пример внутреннего и внешнего интерфейсов объекта кофеварка

Результатом слаженной работы внешнего и внутреннего интерфейсов объекта кофеварка является кофе.

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

Таким образом, Внутренний интерфейс – это свойства и методы, доступ к кото-

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

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

7

16.5. От сокрытия данных к инкапсуляции

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

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

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

16.6. Реализация функций – членов класса

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

объявление класса, где описываются данные, а также внешний и внутренний интерфейсы;

определение методов класса, которые описывают их реали-

зацию.

При определении нужно знать две характеристики:

методыклассаимеютдоступкприватнымкомпонентамкласса;

для определения принадлежности функции данному классу используется операция разрешения контекста «::», определяющая область видимости функции в классе.

Например, имеется некий класс Car и в нем объявлен метод (функция) start_сar, который является членом класса Car. Определение метода start_сar в С++ выглядит следующим образом:

8

имя_возвращаемого_типа_функции ИмяКласса::имяМетода() {…} // start_сar является членом класса Car

void Car::start_сar() {…}

Таким образом, идентификатор start_сar() имеет область видимости класса Car.

Вызов метода осуществляется с помощью объекта, поскольку данные и методы принадлежат конкретному объекту. Для обращения к нужному методу нужно использовать операцию членства «.» (точку):

Car obj; obj.start_сar();

В парадигме С++ любой метод, определение которого выполнено внутри класса, автоматически становится встроенным. Можно определить метод вне класса и тем не менее сделать его встроенным. Для этого перед определением метода указывается ключевое слово inline.

Пример. Класс Car (автомобиль)

//Директивы опущены

//Объявление класса, заголовочный файл car.h class Car

{

private:

int ls = 150; // Мощность автомобиля int weight = 1500; // Вес автомобиля

public:

/* Объявление метода, реализация в car.cpp */ void start_сar();

/* Объявление встроенного метода, реализация в car.cpp */ void get_power();

};

//Определение методов класса, файл исходного кода car.cpp #include <iostream>

9

// Определение метода void start_car() void Car::start_car() {

// Вывод сообщения на экран std::cout<<"Завели автомобиль!\n";

}

inline int get_power() { return ls; }

16.7. Конструктор и деструктор

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

Имя метода конструктора совпадает с именем класса. Конструктор не может возвращать значения, поэтому указание возвращаемого типа не требуется.

Возможный конструктор для класса Car:

Car(int ls, int weight); // Объявление конструктора Car::Car (int ls, int weight) {…} // Определение конструктора

При использовании конструкторов в С++ возможны два способа инициализации объектов с помощью конструкторов. Первый – вызвать конструктор явно:

Car toyota = Car(170, 1534);

Второй представляет собой более компактную форму и вызывается неявно:

Car toyota(170, 1534);

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

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

10

Соседние файлы в папке книги