231.97K
Категория: ПрограммированиеПрограммирование

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

1.

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

2.

Задача «Stud/Sim – 4»
• Одна заготовка класса
class Student {
private:
char name[51];
char surname[51];
int hp; // очки здоровья персонажа
public:
void start_game();
bool is_alive();
void show();
};
• Много характеристик
• Много действий
Кто же выйдет победителем?

3.

Вспоминаем: окружность
class Circle {
// Приватные поля класса
private:
float x;
float y;
float radius;
public:
// Публичные поля класса
void set_parameters(float x,
float y,
Интерфейс
float radius);
класса
// ...
};
void Circle::set_parameters(float x, float y,
float radius) {
this->x = x;
this->y = y;
this->radius = radius;
}
Что нужно сделать для того,
чтобы подготовить объект к работе?

4.

Вспоминаем: окружность
Что нужно сделать для того, чтобы подготовить объект к работе?
1. Создать объект:
Circle c;
2. Установить внутреннее состояние объекта:
c.set_parameters(1.0, 1.0, 5.0);
3. …
4. Можно использовать:
cout << c.get_square();
Что будет, если пропустить пункт 2?
• Поля объявлены, но значение не задано
• В полях хранится мусор
• Корректное использование не гарантируется
(либо некорректный ответ, либо RT)
Следствие: пропускать этот пункт не рекомендуется
Идея: почему бы не объединить п.1 и п.2

5.

Конструктор
Это метод объекта, выполняемый при его создании
Синтаксис (объявление в интерфейсе класса):
имя_класса();
Синтаксис (реализация):
имя_класса::имя_класса() {
тело конструктора;
}
Пример:
class Point {
int x;
int y;
public:
Point();
// ...
};
Конструктор не имеет типа
возвращаемого значения
Point::Point() {
this->x = 5;
this->y = 3;
}

6.

Конструктор
Важные факты:
1. конструктор не возвращает никакого значения
2. конструктор должен быть объявлен в
публичной секции класса.

7.

Конструктор c параметрами
Это метод объекта, выполняемый при его создании
Синтаксис (объявление в интерфейсе класса):
имя_класса(параметры);
Синтаксис (реализация):
имя_класса::имя_класса(параметры) {
тело конструктора;
}
Пример:
class Point2d {
int x;
int y;
public:
Point2d(int x,
int y);
// ...
};
Point2d::Point2d(int x,
int y)
{
this->x = x;
this->y = y;
}

8.

Конструктор c параметрами
Как создать объект?
Если конструктор без параметров
Point p;
Если конструктор с параметрами
Point2d pp(36, 18);
Параметры конструктора
Важно!
Point2d pt;
Ошибка компиляции (CE)
WHY???

9.

Конструктор c параметрами
Причина, часть 1:
Конструктор без параметров – присутствует в классе всегда
class Sample {
int value;
public:
Sample() {}
void set_v(int v);
class Sample {
int value;
public:
Sample();
void set_v(int v);
}
}
Конструктор без параметров – default constructor
(т.к. вызывается по умолчанию при создании объекта).
Если мы создаём в классе конструктор без параметров – он
заменяет пустую заготовку
Sample::Sample() {
this->value = 42;
}

10.

Конструктор c параметрами
Причина, часть 2:
Если мы создаём в классе конструктор c параметрами – он
также заменяет пустую заготовку
class Sample {
int value;
public:
А его нет =(
Sample()
{}v) { this->value = v; }
Sample(int
void set_v(int v);
}
При попытке создать объект без параметров…
Sample sv;
Ищем default constructor
CE
А если я хочу, чтобы объект умел создаваться и с
параметрами и без параметров?

11.

Конструкторы
В классе можно создать несколько конструкторов
class Point {
int x;
int y;
public:
Point();
Point(int x, int y);
Перегрузка функций
};
Point::Point() {
this->x = 5;
this->y = 3;
}
Point::Point(int x, int y) {
this->x = x;
this->y = y;
}
Рекомендуется добавлять конструктор по умолчанию во все классы

12.

Вспоминаем: окружность
class Circle {
private:
float x;
float y;
float radius;
public:
Circle();
Circle(float x, float y, float radius);
// ...
};
Circle::Circle() {
this->x = 0;
this->y = 0;
this->radius = 0;
}
Circle::Circle(float x, float y,
float radius) {
this->x = x;
this->y = y;
this->radius = radius;
}
Выглядит лучше

13.

А что, если …
… если мы будем использовать динамический массив в классе?
• В начале работы нужно создать дин. массив
Для этой цели подойдёт конструктор
• В конце работы нужно освободить память
class Multiline {
private:
Point *data;
int count;
public:
Multiline();
void show();
};
Multiline::Multiline() {
this->data = new int[10];
this->count = 10;
}

14.

Деструктор
Это метод, выполняемый в конце времени жизни объекта
(перед окончательным удалением из памяти)
Синтаксис (объявление в интерфейсе класса):
~имя_класса();
Синтаксис (реализация):
имя_класса::~имя_класса() {
тело конструктора;
}
Деструктор используется для:
закрытия файлов
освобождения памяти
сбора статистики использования
отправки отчёта о результатах пользователю
иных действий

15.

Класс с деструктором
class PLine {
private:
Point *data;
int count;
public:
void show();
PLine();
PLine(int size);
~PLine();
};
PLine::PLine() {
this->data = new
int[10];
this->count = 10;
}
PLine::PLine(int size) {
this->data = new
int[size];
this->count = size;
}
PLine::~PLine() {
delete [] this->data;
}

16.

Деструктор
Важные факты:
1. У класса может быть только один деструктор.
2. Деструктор не принимает никаких параметров.
3. Деструктор не возвращает никаких значений.
4. Как и конструктор, деструктор должен находиться
в публичной секции класса.
P.S. Установленные сокращения
• constructor = ctor
• destructor = dtor
English     Русский Правила