1.06M
Категория: ПрограммированиеПрограммирование

Раздел 4. Объектно-ориентированное программирование. Тема 15. Введение в ООП

1.

Раздел 4. Объектно-ориентированное
программирование
Тема 15. Введение в ООП
Тема 16. Инкапсуляция
Тема 17. Абстрактные типы данных
Тема 18. Шаблоны классов
Тема 19. λ-функции
Тема 20. Библиотека STL
Тема 21. Наследование и полиморфизм
Тема 22. Основы объектно-ориентированного проектирования
Раздел 5. Дополнительные темы
Тема 23. Основы системы ввода-вывода
Тема 24. Обработка исключений
Левкович Н.В.
2022/2023
ВВЕДЕНИЕ В ООП
1

2.

Декомпозиция: divide et impera
Современные программные системы – сложные:
o
o
o
они отражают сложность реального мира
процесс их разработки сложен (и слабо стандартизирован)
программа - дискретная система, а дискретные системы неустойчивы:
маленькая ошибка приводит к значительным последствиям
Общие свойства сложных систем:
o
o
o
o
имеют внутреннюю структуру, то есть состоят из компонент подсистем, которые, в свою очередь, тоже могут быть разбиты на
подсистемы
внутренние связи подсистем сильнее связей между подсистемами.
Это дает возможность по отдельности изучать каждую подсистему.
состоят из ограниченного числа типов подсистем, скомбинированных и
организованных различным образом
являются результатом эволюции более простых систем
Левкович Н.В.
2022/2023
ВВЕДЕНИЕ В ООП
2

3.

Декомпозиция: divide et impera
Рост сложности и объема ПО на примере ОС Windows
(неофициальные данные):
Разработ Тестиров
чиков
щиков
Кол-во строк
исходного кода
Дата выхода
Операционная система
Июль 1993
NT 1.0 (released as 3.1)
200
140
4-5 млн
Сентябрь 1994
NT 2.0 (released as 3.5)
300
230
7-8 млн
Май 1995
NT 3.0 (released as 3.51)
450
325
9-10 млн
Июль 1996
NT 4.0 (released as 4.0)
800
700
11-12 млн
Декабрь 1999
NT 5.0 (Windows 2000)
1,400
1,700
29+ млн
Октябрь 2001
NT 5.1 (Windows XP)
1,800
2,200
40 млн
Апрель 2003
NT 5.2
(Windows Server 2003)
2,000
2,400
50 млн
Левкович Н.В.
2022/2023
ВВЕДЕНИЕ В ООП
3

4.

Декомпозиция: divide et impera
Иллюстрация сложности разработки:
Служба Microsoft Consulting Services провела анализ результатов
выполнения большого количества своих программных проектов.
Оказалось, что вероятность провала программных проектов довольно
велика:
o Только 24% проектов можно признать в той или иной степени
успешными,
o 26% не были завершены,
o 50% столкнулись с большими проблемами, например, бюджет был
превышен вдвое или/и затрачено в 1,5 раза больше времени.
Левкович Н.В.
2022/2023
ВВЕДЕНИЕ В ООП
4

5.

Декомпозиция: divide et impera
Последствия маленьких ошибок – крах программной системы:
double x;
...
short i = x;
Вместо:
Ошибка взятия целой части
дробного числа при выходе
числа с плавающей точкой
за диапазон допустимых
16-битовых целых
double x;
short i;
...
if (abs(x) < 32767)
i = x;
else
{
...
}
Левкович Н.В.
2022/2023
Результат:
ВВЕДЕНИЕ В ООП
5

6.

Декомпозиция: divide et impera
"Такие незначительные изменения,
такие огромные последствия"
4 июня 1996 года
Взрыв ракетыносителя Ariane 5
спустя 30 секунд
после запуска.
Левкович Н.В.
2022/2023
ВВЕДЕНИЕ В ООП
6

7.

Декомпозиция: divide et impera
Способ преодоления сложности – декомпозиция
При проектировании сложной программной системы необходимо
разделять ее на все меньшие и меньшие подсистемы, каждую из
которых можно совершенствовать независимо.
Построив модели ограниченного числа подсистем, можно,
комбинируя их различным образом, строить множество гораздо
более сложных систем.
Построив более простую модель, ее можно далее развивать,
следуя за развитием системы.
В этом случае мы не превысим пропускную способность
человеческого мозга: для понимания любого уровня системы
необходимо держать в памяти информацию лишь о немногих
частях системы.
Левкович Н.В.
2022/2023
ВВЕДЕНИЕ В ООП
7

8.

Декомпозиция: divide et impera
в прошлом семестре мы работали с
Алгоритмической декомпозицией:
Основана на разделении алгоритмов на блоки - функции
Каждая функция выполняет один из этапов общего процесса
Реализуется средствами структурного программирования
Объектно-ориентированная декомпозиция
Мир представляется совокупностью автономно действующих
объектов, моделирующих объекты реального мира
Каждый объект обладает своим собственным поведением
Послав объекту сообщение, можно попросить его выполнить
присущее ему действие
Объекты взаимодействуют друг с другом, моделируя поведение
системы, соответствующее более высокому уровню
Реализуется средствами объектно-ориентированного
программирования
Левкович Н.В.
2022/2023
ВВЕДЕНИЕ В ООП
8

9.

Декомпозиция: divide et impera
Один из способов разделения набора сущностей
в ООП проекте – структурная иерархия.
Иерархическое упорядочение задач или объектов –
важный принцип управления сложностью проекта,
лежащий в основе объектно-ориентированного подхода.
Структурная иерархия строится по простому принципу
разделения целого на составные части:
Самолёт
Кабина
Приборная
панель
Левкович Н.В.
2022/2023
Корпус
Шасси
Салон
Крылья
Двигатели
ВВЕДЕНИЕ В ООП
Закрылки
Хвост
Рули
9

10.

Декомпозиция: divide et impera
Другой способ разделения набора сущностей в ООП проекте –
объектная иерархия.
Объектная иерархия строится по принципу наследования свойств
родительских (вышележащих) классов объектов дочерними
(нижележащими) классами.
Родительские классы называют просто родителями (предками),
дочерние – потомками
Животное
Млекопитающее
Кошка
...
Волк
Птица
Собака
Орел
...
Воробей
Птица, собака, волк – это типы животных, называемые классами.
Конкретная реализация того или иного класса, например, кот
Матроскин, является объектом данного класса.
Левкович Н.В.
2022/2023
ВВЕДЕНИЕ В ООП
10

11.

Декомпозиция: divide et impera
Объектно-ориентированное программирование (ООП) –
методология программирования, основанная на представлении
программы в виде совокупности объектов, каждый из которых
является экземпляром определенного класса, а классы могут
образовывать иерархию наследования.
Объекты при этом объединяют данные (как структуры) и
функции (методы манипулирования данными).
Левкович Н.В.
2022/2023
ВВЕДЕНИЕ В ООП
11

12.

Основные принципы ООП
Объектно-ориентированное
программирование
абстракция
Левкович Н.В.
2022/2023
инкапсуляция
наследование
ВВЕДЕНИЕ В ООП
полиморфизм
12

13.

Основные принципы ООП
Левкович Н.В.
2022/2023
ВВЕДЕНИЕ В ООП
13

14.

Основные принципы ООП
2) инкапсуляция – сокрытие деталей от остального кода:
при вызове функций программист знает типы параметров
функции и что она возвращает. Знание деталей её реализации
ему не обязательно, и иногда может быть вредно.
3) Наследование – это такое отношение между объектами, когда
дочерний объект повторяет набор данных и функций
родительского, но может вводить дополнительные данные или
методы.
4) Полиморфизм – это свойство различных объектов выполнять
одно и то же действие (с одним и тем же названием) по-своему.
(например, перегрузка функций – имя одно, но действия могут
быть совершенно различные, в зависимости от набора
параметров).
Левкович Н.В.
2022/2023
ВВЕДЕНИЕ В ООП
14

15.

Вопросы
9. Декомпозиция как средство преодоления сложности.
Алгоритмическая и объектная декомпозиции.
Левкович Н.В.
2022/2023
ВВЕДЕНИЕ В ООП
15

16.

Составные типы данных: структуры
Примеры объявления структурных типов
struct Date
{
unsigned short year;
unsigned char month;
unsigned char day;
};
struct Cmplx
{
double re;
double im;
} ampl, power;
Левкович Н.В.
2022/2023
struct Name
{
char surname[80];
char firstname[40];
char patronymic[60];
};
Обратите внимание:
описание структуры
заканчивается
точкой с запятой
16

17.

Составные типы данных: структуры
Примеры объявления переменных структурных типов с
инициализацией:
Cmplx c1 = { 0, 0 };
Date birth
= { 1991, 10, 7 },
enter
= { 2009, 9, 1 },
graduate = { 2014, 6, 30 };
Совмещение объявлений типа и переменных (тип безымянный):
struct
{
double re;
double im;
} c1 = { 0, 0 },
c2 = { 1, 0 },
c3 = { 1, 0 };
Левкович Н.В.
2022/2023
17

18.

Составные типы данных: структуры
Доступ к элементам структуры: оператор . (точка):
Имя_переменной.Имя_поля
birth.year = 2002;
birth.month = 12;
c1.re = 12.5;
c1.im = -24;
c2.re = c1.re * c1.re + c1.im * c1.im;
Присваивание переменных – структур одного типа:
c1 = c2;
expel.year = enter.year;
Левкович Н.В.
2022/2023
18

19.

Указатели
Указатели на структуры
доступ к членам структуры по указателю на неё через операцию
разыменования:
(*p).dRe = 1;
cout << cmpl.dRe;
(*p).dIm = (*p).dRe;
или оператор -> ("стрелка"):
p->dRe = 1;
cout << cmpl.dRe;
p->dIm = p->dRe;
1
1
Оператор «.» используется для непосредственного обращения к
членам структуры, а оператор «->» для доступа к членам
структуры через указатель на нее
Левкович Н.В.
2022/2023
19

20.

Шаблоны функций
template <typename T>
void swap(T &a, T &b)
{
T tmp = a;
a = b;
b = tmp;
}
int main()
{
int x = 15,
y = 2;
Явное указание типа
шаблонного параметра
swap(x, y);
swap<int>(x, y);
return 0;
}
Левкович Н.В.
2022/2023
20

21.

Шаблоны структур
template <typename T>
struct Cmplx
{
T re;
T im;
};
int main()
{
Cmplx<double> val;
val.re = 1.0;
val.im = 10.0;
...
return 0;
}
Левкович Н.В.
2022/2023
Явное указание типа
шаблонного параметра
21

22.

Раздел 4. Объектно-ориентированное
программирование
Тема 15. Введение в объектно-ориентированное программирование
Тема 16. Инкапсуляция
Тема 17. Абстрактные типы данных
Тема 18. Шаблоны классов
Тема 19. λ-функции
Тема 20. Библиотека STL
Тема 21. Наследование и полиморфизм
Тема 22. Основы объектно-ориентированного проектирования
Раздел 5. Дополнительные темы
Тема 23. Основы системы ввода-вывода
Тема 24. Обработка исключений
Левкович Н.В.
2022/2023
ИНКАПСУЛЯЦИЯ
22

23.

ИНКАПСУЛЯЦИЯ
Инкапсуляция – механизм, связывающий воедино программный код
и данные, которыми он манипулирует, а также обеспечивающий их
защиту от внешнего вмешательства и неправильного использования.
Класс – определенный пользователем проблемно-ориентированный
тип данных, описывающий внутреннюю структуру объектов, которые
являются его экземплярами.
Объект (экземпляр класса) находится в таком же отношении к
своему классу, в каком переменная находится по отношению к своему
типу.
Данные и функции внутри класса называются членами класса
o Данные, входящие в класс, называются данными-членами или
полями.
o Функции, принадлежащие классу, называют функциями-членами
или методами.
Левкович Н.В.
2022/2023
ИНКАПСУЛЯЦИЯ
23

24.

ИНКАПСУЛЯЦИЯ
Синтаксис объявления класса (пока без наследования)
class Имя_класса
{
спецификатор доступа:
объявление данных и функции;
спецификатор доступа:
объявление данных и функции;
спецификатор доступа:
объявление данных и функции;
};
struct Имя_класса
{
спецификатор доступа:
объявление данных и функции;
спецификатор доступа:
объявление данных и функции;
спецификатор доступа:
объявление данных и функции;
};
Имя_класса
поля
методы
Левкович Н.В.
2022/2023
ИНКАПСУЛЯЦИЯ
24

25.

ИНКАПСУЛЯЦИЯ
Пример описания простейшего класса,
включающего только данные:
m_Height
class СBox
{
public:
double m_Length;
double m_Width;
double m_Height;
};
m_Length
Левкович Н.В.
2022/2023
ИНКАПСУЛЯЦИЯ
m_Width
25

26.

ИНКАПСУЛЯЦИЯ
Пример описания простейшего класса,
включающего только данные:
class СBox
{
public:
double m_Length;
double m_Width;
double m_Height;
};
Спецификатор доступа определяет, где в программе
будут доступны описанные за
ним члены класса.
Действие спецификатора
доступа распространяется до
следующего спецификатора или
до конца описания класса
Левкович Н.В.
2022/2023
ИНКАПСУЛЯЦИЯ
26

27.

ИНКАПСУЛЯЦИЯ
Имеются 3 спецификатора доступа:
o public – члены класса будут доступны как в классе, так и в
любой точке программы внутри области видимости класса,
к которому они относятся
o private – члены класса будут доступны только внутри класса
(в функциях-членах класса)
o protected – члены класса будут доступны только внутри класса
и внутри потомков класса (см. лекцию о наследовании)
По умолчанию, все члены класса, объявленные после ключевого
слова class до первого спецификатора доступа имеют
спецификацию доступа private.
Структуры в С++ полностью аналогичны классам, разница только
в спецификаторе доступа по умолчанию – public
(оставлено для совместимости с языком С)
Левкович Н.В.
2022/2023
ИНКАПСУЛЯЦИЯ
27

28.

ИНКАПСУЛЯЦИЯ
// Объявление экземпляров класса
CBox box1, box2;
// Объявление указателей на класс
CBox *pBox = &box1;
Динамическое выделение памяти для экземпляра класса
pBox = new CBox;
delete pBox;
// Динамическое выделение памяти с одновременной
// инициализацией (С++11, только public поля)
pBox = new CBox { 1, 1, 1 };
// Доступ к членам – аналогично доступу к полям структур
box1.m_Length = 2.5;
box2.m_Width = box1.m_Length;
pBox->m_Height = box1.m_Length;
pBox->m_Length = pBox->m_Height;
Левкович Н.В.
2022/2023
ИНКАПСУЛЯЦИЯ
28

29.

ИНКАПСУЛЯЦИЯ
Первый принцип инкапсуляции:
o объединение данных и методов.
Добавим функцию вычисления объема:
class CBox
{
public:
double m_Length;
double m_Width;
double m_Height;
double Volume();
};
double CBox::Volume()
{
return m_Length * m_Width * m_Height;
}
Левкович Н.В.
2022/2023
ИНКАПСУЛЯЦИЯ
29

30.

ИНКАПСУЛЯЦИЯ
Поработаем с классом CBox:
int main()
{
CBox myBox1;
// Автоматическое выделение памяти
myBox1.m_Length = 2;
myBox1.m_Width = 3;
myBox1.m_Height = 4;
24
cout << myBox1.Volume() << endl;
CBox *pMyBox2 = new CBox; // Динамическое выделение памяти
pMyBox2->m_Length = 5;
pMyBox2->m_Width = 6;
pMyBox2->m_Height = 7;
cout << pMyBox2->Volume() << endl; 210
delete pMyBox2;
return 0;
}
Левкович Н.В.
2022/2023
ИНКАПСУЛЯЦИЯ
30

31.

ИНКАПСУЛЯЦИЯ
Второй принцип инкапсуляции:
o защита от внешнего вмешательства.
Доступ к данным через явный интерфейс
class CBox
{
private:
double m_Length;
double m_Width;
double m_Height;
public:
void SetLength(double sl)
void SetWidth(double sw)
void SetHeight(double sh)
double GetLength()
double GetWidth()
double GetHeight()
double Volume();
};
Левкович Н.В.
2022/2023
{ m_Length = sl; }
{ m_Width = sw; }
{ m_Height = sh; }
{ return m_Length; }
{ return m_Width; }
{ return m_Height; }
ИНКАПСУЛЯЦИЯ
31

32.

ИНКАПСУЛЯЦИЯ
Работаем с измененным классом CBox:
int main()
{
CBox myBox1;
myBox1.SetLength(2);
myBox1.SetWidth(3);
myBox1.SetHeight(4);
cout << myBox1.GetHeight() << " "
<< myBox1.Volume() << endl;
4
CBox *pMyBox2 = new CBox;
pMyBox2->SetLength(5);
pMyBox2->SetWidth(6);
pMyBox2->SetHeight(7);
cout << pMyBox2->GetLength() << " " 5
<< pMyBox2->Volume() << endl;
delete pMyBox2;
24
210
return 0;
}
Левкович Н.В.
2022/2023
ИНКАПСУЛЯЦИЯ
32

33.

ИНКАПСУЛЯЦИЯ
Для чего это нужно: независимость интерфейса от реализации,
разрешаются только операции, определенные через интерфейс:
class CBox
{
private:
double m_Size[3];
// меняем на хранение полей в массиве
public:
void SetLength(double sl)
{ m_Size[0] = sl; }
void SetWidth(double sw)
{ m_Size[1] = sw; }
void SetHeight(double sh)
{ m_Size[2] = sh; }
double GetLength()
{ return m_Size[0]; }
double GetWidth()
{ return m_Size[1]; }
double GetHeight()
{ return m_Size[2]; }
double Volume();
};
double CBox::Volume()
{
return m_Size[0] * m_Size[1] * m_Size[2];
}
Левкович Н.В.
2022/2023
ИНКАПСУЛЯЦИЯ
33

34.

ИНКАПСУЛЯЦИЯ
* В использующей класс программе ничего менять не надо:
int main()
{
CBox myBox1;
myBox1.SetLength(2);
myBox1.SetWidth(3);
myBox1.SetHeight(4);
cout << myBox1.GetHeight() << " "
<< myBox1.Volume() << endl;
4
CBox *pMyBox2 = new CBox;
pMyBox2->SetLength(5);
pMyBox2->SetWidth(6);
pMyBox2->SetHeight(7);
cout << pMyBox2->GetLength() << " " 5
<< pMyBox2->Volume() << endl;
delete pMyBox2;
24
210
return 0;
}
Левкович Н.В.
2022/2023
ИНКАПСУЛЯЦИЯ
34

35.

ИНКАПСУЛЯЦИЯ
Реализация через классы – это просто более удобная запись
реализации через функции, которая требует от программиста
явного структурирования предметной области задачи
структурное программирование
struct CBox
{
double m_Size[3];
};
double Volume(CBox* this)
{
return this->m_Size[0] *
this->m_Size[1] *
this->m_Size[2];
}
Левкович Н.В.
2022/2023
объектно-ориентированное программирование
class CBox
{
private:
double m_Size[3];
public:
void SetSize(int dim, double sl);
double GetSize(int dim);
double Volume();
};
double CBox::Volume()
{
return m_Size[0] *
m_Size[1] *
m_Size[2];
}
ИНКАПСУЛЯЦИЯ
35

36.

ИНКАПСУЛЯЦИЯ
Реализация через классы – это просто более удобная запись
реализации через функции, которая требует от программиста
явного структурирования предметной области задачи
структурное программирование
struct CBox
{
double m_Size[3];
};
double Volume(CBox* this)
{
return this->m_Size[0] *
this->m_Size[1] *
this->m_Size[2];
}
ключевое слово this – это
указатель на текущий объект,
он объявляется компилятором
автоматически во всех
функциях-членах класса
Левкович Н.В.
2022/2023
объектно-ориентированное программирование
class CBox
{
private:
double m_Size[3];
public:
void SetSize(int dim, double sl);
double GetSize(int dim);
double Volume();
};
double CBox::Volume()
{
return this->m_Size[0] *
this->m_Size[1] *
this->m_Size[2];
}
ИНКАПСУЛЯЦИЯ
36

37.

Декомпозиция: divide et impera
Дано: некая сложная система
Надо: используя принцип
«разделяй и властвуй»
упростить управление такой
системой.
Решение:
1. Фаза анализа: выделяем в сложной системе элементы из
которых состоит система
2. Фаза синтеза: объединяем определённые на прошлой фазе
элементы в группы по смыслу
Итого: получили описание системы состоящее из меньшего
количества составных частей, с такой системой работать проще.
(Человек может держать в голове одновременно максимум
5±2 объектов. Если их больше – автоматически срабатывает
алгоритм, приведённый выше).
Левкович Н.В.
2022/2023
ИНКАПСУЛЯЦИЯ
37

38.

ИНКАПСУЛЯЦИЯ: КОНСТРУКТОР
Конструктор класса – специальная функция класса, которая
вызывается при создании нового объекта класса. Она позволяет
инициализировать объекты во время их создания и захватывать
ресурсы, необходимые для их функционирования.
структурное программирование
struct CBox
{
double m_Size[3];
};
void InitBox(CBox *pBox)
{
for (int i = 0; i < 3; i++)
pBox->m_Size[i] = 0;
}
int main()
{
CBox box;
InitBox(&box);
...
}
Левкович Н.В.
2022/2023
объектно-ориентированное программирование
class CBox
{
double m_Size[3];
public:
CBox()
{
for (int i = 0; i < 3; i++)
m_Size[i] = 0;
}
};
int main()
{
CBox box;
...
}
ИНКАПСУЛЯЦИЯ
38

39.

ИНКАПСУЛЯЦИЯ: КОНСТРУКТОР
Конструктор класса – специальная функция класса, которая
вызывается при создании нового объекта класса. Она позволяет
инициализировать объекты во время их создания и захватывать
ресурсы, необходимые для их функционирования.
объектно-ориентированное программирование
Конструкторы всегда
называются по имени класса
и не имеют возвращаемого
значения
Конструктор вызывается
автоматически в момент
создания переменной-объекта:
его невозможно забыть вызвать
Левкович Н.В.
2022/2023
class CBox
{
double m_Size[3];
public:
CBox()
{
for (int i = 0; i < 3; i++)
m_Size[i] = 0;
}
};
int main()
{
CBox box;
...
}
ИНКАПСУЛЯЦИЯ
39

40.

ИНКАПСУЛЯЦИЯ: КОНСТРУКТОР
class CBox
Реализация конструктора внутри объявления класса
{
double m_Size[3];
public:
CBox()
{
for (double* p = &m_Size[0]; p < &m_Size[countof(m_Size)]; ++p)
*p = 0;
}
};
class CBox
{
double m_Size[3];
public:
CBox();
};
Реализация конструктора вне объявления класса
CBox::CBox()
{
for (double* p = &m_Size[0]; p < &m_Size[countof(m_Size)]; ++p)
*p = 0;
}
Левкович Н.В.
2022/2023
ИНКАПСУЛЯЦИЯ
40

41.

ИНКАПСУЛЯЦИЯ: КОНСТРУКТОР
class CBox
Реализация конструктора внутри объявления класса
{
double m_Size[3];
public:
CBox()
{
for (double* p = begin(m_Size); p < end(m_Size); ++p)
*p = 0;
}
};
class CBox
{
double m_Size[3];
public:
CBox();
};
Реализация конструктора вне объявления класса
C++17: функции begin() и end() возвращают
указатель на первый и на следующий за
последним элементы массива фиксированного
размера
CBox::CBox()
{
for (double* p = begin(m_Size); p < end(m_Size); ++p)
*p = 0;
}
Левкович Н.В.
2022/2023
ИНКАПСУЛЯЦИЯ
41

42.

ИНКАПСУЛЯЦИЯ: КОНСТРУКТОР
class CBox
{
double m_Size[3];
public:
CBox()
{
m_Size[0] = 0;
m_Size[1] = 0;
m_Size[2] = 0;
}
};
Конструкторы можно перегружать,
как и обычные функции
можно использовать
инициализацию параметров по
умолчанию
CBox(double width, double height, double length = 1)
{
m_Size[0] = width;
m_Size[1] = height;
m_Size[2] = length;
int main()
}
{
CBox box1;
CBox box2(1, 2, 3);
...
}
Левкович Н.В.
2022/2023
ИНКАПСУЛЯЦИЯ
42

43.

ИНКАПСУЛЯЦИЯ: КОНСТРУКТОР
Инициализацию переменных-членов класса можно выполнять:
class CBox
{
double m_Width;
double m_Height;
double m_Length;
public:
CBox(double width, double height, double length)
{
m_Width = width;
(1)
m_Height = height;
m_Length = length;
}
в теле конструктора
CBox(double width, double height, double length)
: m_Width(width),
(2)
m_Height(height),
m_Length(length)
{ }
или вне тела конструктора
};
Левкович Н.В.
2022/2023
ИНКАПСУЛЯЦИЯ
43

44.

ИНКАПСУЛЯЦИЯ: КОНСТРУКТОР
Инициализацию переменных-членов класса можно выполнять:
class CBox
{
double m_Width;
double m_Height;
double m_Length;
public:
CBox(double width, double height, double length);
};
CBox::CBox(double width, double height, double length)
{
m_Width = width;
(1)
m_Height = height;
m_Length = length;
}
в теле конструктора
CBox::CBox(double width, double height, double length) :
m_Width(width),
(2)
m_Height(height),
m_Length(length)
{}
или вне тела конструктора
Левкович Н.В.
2022/2023
ИНКАПСУЛЯЦИЯ
44

45.

ИНКАПСУЛЯЦИЯ: КОНСТРУКТОР
Вопрос: если бы я не использовал
префикс 'm_' для полей класса, то поля
класса назывались бы так же, как
параметр конструктора.
Как требуется изменить следующий код,
чтобы он скомпилировался?
class CBox
{
double width;
double height;
double length;
public:
CBox(double width, double height, double length);
};
CBox::CBox(double width, double height, double length)
{
width = width;
(1)
height = height;
length = length;
}
в теле конструктора
CBox::CBox(double width, double height, double length) :
width(width),
(2)
height(height),
length(length)
{}
или вне тела конструктора
Левкович Н.В.
2022/2023
ИНКАПСУЛЯЦИЯ
45

46.

ИНКАПСУЛЯЦИЯ: КОНСТРУКТОР
Ответ:
в реализации 1 необходимо
class CBox
использовать обращение через
{
указатель this.
double width;
double height;
В примере 2 ничего менять не нужно,
double length;
в скобках могут быть только параметры
public:
функции, а перед скобками только поля
CBox(double width, double height,
double
length);
класса

компилятор
сам разберётся.
};
CBox::CBox(double width, double height, double length)
{
this->width = width;
(1)
this->height = height;
this->length = length;
}
в теле конструктора
CBox::CBox(double width, double height, double length) :
width(width),
(2)
height(height),
length(length)
{}
или вне тела конструктора
Левкович Н.В.
2022/2023
ИНКАПСУЛЯЦИЯ
46
English     Русский Правила