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

Содержание

Слайд 2

Конструктор и деструктор При создании объектов одной из наиболее широко используемых

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

При создании объектов одной из наиболее широко используемых операций

является инициализация элементов данных объекта. Единственным способом, с помощью которого можно обратиться к частным элементам данных, является использование функций класса. Чтобы упростить процесс инициализации элементов данных класса, C++ использует специальную функцию, называемую конструктором, которая запускается для каждого создаваемого объекта.
Деструктор запускается при уничтожении объекта. Деструктор обычно используется, если при уничтожении объекта нужно освободить память, которую занимал объект.
Слайд 3

Основные концепции: Конструктор представляет собой метод класса, который облегчает создаваемым программам

Основные концепции:

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

элементов данных класса.
Конструктор имеет такое же имя, как и класс.
Конструктор не имеет возвращаемого значения.
Каждый раз, когда ваша программа создает переменную класса, C++ вызывает конструктор класса, если конструктор существует.
Слайд 4

Основные концепции: Многие объекты могут распределять память для хранения информации; когда

Основные концепции:

Многие объекты могут распределять память для хранения информации; когда уничтожается

такой объект, C++ будет вызывать специальный деструктор, который может освобождать эту память, очищая ее после объекта.
Деструктор имеет такое же имя, как и класс, за исключением того, что необходимо предварять его имя символом тильды (~).
Деструктор не имеет возвращаемого значения.
Слайд 5

Создание простого конструктора Добавим в класс Students конструктор, который будет принимать

Создание простого конструктора

Добавим в класс Students конструктор, который будет принимать имя

и фамилию ученика, и сохранять эти значения в соответствующих переменных класса.
Слайд 6

Создание простого конструктора // Конструктор Students Students::Students(std::string name, std::string last_name) { Students::set_name(name); Students::set_last_name(last_name); }

Создание простого конструктора

// Конструктор Students
Students::Students(std::string name, std::string last_name)
{
Students::set_name(name);
Students::set_last_name(last_name);
}

Слайд 7

Создание простого конструктора При создании нового объекта, мы должны передать конструктору

Создание простого конструктора

При создании нового объекта, мы должны передать конструктору имя

и фамилию студента. Иначе компиляция программы завершится с ошибкой.
std::string name = “Иван”
std::string last_name =“Иванов”
Students *student = new Students(name, last_name);
Слайд 8

Создание простого конструктора Теперь добавим прототип конструктора в файл students.h. /*

Создание простого конструктора

Теперь добавим прототип конструктора в файл students.h.
/* students.h */
#pragma

once /* Защита от двойного подключения заголовочного файла */
#include
Слайд 9

Создание простого конструктора class Students { public: // Конструктор класса Students

Создание простого конструктора

class Students {
public:
// Конструктор класса Students
Students(std::string,

std::string);
// Установка имени студента
void set_name(std::string);
// Получение имени студента
std::string get_name();
Слайд 10

Создание простого конструктора // Установка фамилии студента void set_last_name(std::string); // Получение

Создание простого конструктора

// Установка фамилии студента
void set_last_name(std::string);
// Получение фамилии

студента
std::string get_last_name();
// Установка промежуточных оценок
void set_scores(int []);
Слайд 11

Создание простого конструктора // Установка среднего балла void set_average_ball(float); // Получение

Создание простого конструктора

// Установка среднего балла
void set_average_ball(float);
// Получение среднего

балла
float get_average_ball();
private:
// Промежуточные оценки
int scores[5];
Слайд 12

Создание простого конструктора // Средний балл float average_ball; // Имя std::string

Создание простого конструктора

// Средний балл
float average_ball;
// Имя
std::string name;

// Фамилия
std::string last_name;
};
Слайд 13

Создание простого конструктора В файле students.cpp определим сам конструктор. /* students.cpp */ #include #include #include "students.h"

Создание простого конструктора

В файле students.cpp определим сам конструктор.
/* students.cpp */
#include
#include


#include "students.h"
Слайд 14

Создание простого конструктора / Конструктор Students Students::Students(std::string name, std::string last_name) { Students::set_name(name); Students::set_last_name(last_name); }

Создание простого конструктора

/ Конструктор Students
Students::Students(std::string name, std::string last_name)
{
Students::set_name(name);
Students::set_last_name(last_name);
}

Слайд 15

Создание простого конструктора // Установка имени студента void Students::set_name(std::string student_name) { Students::name = student_name; }

Создание простого конструктора

// Установка имени студента
void Students::set_name(std::string student_name)
{
Students::name = student_name;
}

Слайд 16

Создание простого конструктора // Получение имени студента std::string Students::get_name() { return Students::name; }

Создание простого конструктора

// Получение имени студента
std::string Students::get_name()
{
return Students::name;
}

Слайд 17

Создание простого конструктора // Установка фамилии студента void Students::set_last_name(std::string student_last_name) { Students::last_name = student_last_name; }

Создание простого конструктора

// Установка фамилии студента
void Students::set_last_name(std::string student_last_name)
{
Students::last_name = student_last_name;
}

Слайд 18

Создание простого конструктора // Получение фамилии студента std::string Students::get_last_name() { return Students::last_name; }

Создание простого конструктора

// Получение фамилии студента
std::string Students::get_last_name()
{
return Students::last_name;
}

Слайд 19

Создание простого конструктора // Установка промежуточных оценок void Students::set_scores(int scores[]) {

Создание простого конструктора

// Установка промежуточных оценок
void Students::set_scores(int scores[])
{
int sum =

0;
for (int i = 0; i < 5; ++i) {
Students::scores[i] = scores[i];
sum += scores[i];
}
}
Слайд 20

Создание простого конструктора // Установка среднего балла void Students::set_average_ball(float ball) { Students::average_ball = ball; }

Создание простого конструктора

// Установка среднего балла
void Students::set_average_ball(float ball)
{
Students::average_ball = ball;
}

Слайд 21

Создание простого конструктора // Получение среднего балла float Students::get_average_ball() { return Students::average_ball; }

Создание простого конструктора

// Получение среднего балла
float Students::get_average_ball()
{
return Students::average_ball;
}

Слайд 22

Создание простого конструктора В main() мы принимаем от пользователя имя и

Создание простого конструктора

В main() мы принимаем от пользователя имя и фамилию

ученика, и сохраняем их во временных локальных переменных. После этого создаем новый объект класса Students, передавая его конструктору эти переменные.
Слайд 23

Создание простого конструктора /* main.cpp */ #include #include "students.h“ int main(int

Создание простого конструктора

/* main.cpp */
#include
#include "students.h“
int main(int argc, char *argv[])
{

// Локальная переменная, хранящая имя ученика
std::string name;
// И его фамилию
std::string last_name;
Слайд 24

Создание простого конструктора // Ввод имени std::cout getline(std::cin, name); // И фамилии std::cout getline(std::cin, last_name);

Создание простого конструктора

// Ввод имени
std::cout << "Name: ";
getline(std::cin, name);

// И фамилии
std::cout << "Last name: ";
getline(std::cin, last_name);
Слайд 25

Создание простого конструктора // Передача параметров конструктору Students *student = new

Создание простого конструктора

// Передача параметров конструктору
Students *student = new Students(name,

last_name);
// Оценки
int scores[5];
// Сумма всех оценок
int sum = 0;
Слайд 26

Создание простого конструктора // Ввод промежуточных оценок for (int i =

Создание простого конструктора

// Ввод промежуточных оценок
for (int i =

0; i < 5; ++i) {
std::cout << "Score " << i+1 << ": ";
std::cin >> scores[i];
// суммирование
sum += scores[i];
}
Слайд 27

Создание простого конструктора // Сохраняем промежуточные оценки в объект класса Student

Создание простого конструктора

// Сохраняем промежуточные оценки в объект класса Student
student->set_scores(scores);

// Считаем средний балл
float average_ball = sum / 5.0;
// Сохраняем средний балл
student->set_average_ball(average_ball);
Слайд 28

Создание простого конструктора // Выводим данные по студенту std::cout get_name() get_last_name()

Создание простого конструктора

// Выводим данные по студенту
std::cout << "Average ball

for " << student->get_name() << " "
<< student->get_last_name() << " is "
<< student->get_average_ball() << std::endl;
// Удаление объекта student из памяти
delete student;
return 0;
}
Слайд 29

Сохранение оценок в файл Чтобы после завершения работы с программой, все

Сохранение оценок в файл

Чтобы после завершения работы с программой, все данные

сохранялись, необходимо записывать их в текстовый файл.
Пример файла с оценками представлен в следующем виде:
Андрей Сидоров 5 5 3 4 5
Иван Иванов 5 3 3 3 3
Слайд 30

Сохранение оценок в файл Для работы с файлами воспользуемся библиотекой fstream,

Сохранение оценок в файл

Для работы с файлами воспользуемся библиотекой fstream, которая

подключается в заголовочном файле с таким же именем.
#include
// Запись данных о студенте в файл
void Students::save()
{
std::ofstream fout("students.txt", std::ios::app);
Слайд 31

Сохранение оценок в файл fout for (int i = 0; i fout } fout fout.close(); }

Сохранение оценок в файл

fout << Students::get_name() << " "
<<

Students::get_last_name() << " ";
for (int i = 0; i < 5; ++i) {
fout << Students::scores[i] << " ";
}
fout << std::endl;
fout.close();
}
Слайд 32

Сохранение оценок в файл Переменная fout — это объект класса ofstream,

Сохранение оценок в файл

Переменная fout — это объект класса ofstream, который

находится внутри библиотеки fstream. Класс ofstream используется для записи каких-либо данных во внешний файл. У него тоже есть конструктор. Он принимает в качестве параметров имя выходного файла и режим записи.
Слайд 33

Сохранение оценок в файл В данном случае, мы используем режим добавления

Сохранение оценок в файл

В данном случае, мы используем режим добавления —

std::ios:app (append). После завершения работы с файлом, необходимо вызвать метод close() для того, чтобы закрыть файловый дескриптор.
Слайд 34

Сохранение оценок в файл тобы сохранить оценки студента, мы будем вызывать

Сохранение оценок в файл

тобы сохранить оценки студента, мы будем вызывать только

что созданный метод save().
Students student = new Students(“Иван", “Иванов");
student->save();
Слайд 35

Деструктор Логично было бы сохранять все оценки после того, как работа

Деструктор

Логично было бы сохранять все оценки после того, как работа со

студентом закончена. Для этого создадим деструктор класса Students, который будет вызывать метод save() перед уничтожением объекта.
// Деструктор Students
Students::~Students()
{
Students::save();
}
Слайд 36

Деструктор Добавим прототипы деструктора и метода save() в students.h. /* students.h

Деструктор

Добавим прототипы деструктора и метода save() в students.h.
/* students.h */
#pragma once

/* Защита от двойного подключения заголовочного файла */
#include
Слайд 37

Деструктор class Students { public: // Запись данных о студенте в

Деструктор

class Students {
public:
// Запись данных о студенте в файл

void save();
// Деструктор класса Students
~Students();
Слайд 38

Деструктор // Конструктор класса Students Students(std::string, std::string); // Установка имени студента

Деструктор

// Конструктор класса Students
Students(std::string, std::string);
// Установка имени студента
void

set_name(std::string);
// Получение имени студента
std::string get_name();
Слайд 39

Деструктор // Установка фамилии студента void set_last_name(std::string); // Получение фамилии студента std::string get_last_name();

Деструктор

// Установка фамилии студента
void set_last_name(std::string);
// Получение фамилии студента

std::string get_last_name();
Слайд 40

Деструктор // Установка промежуточных оценок void set_scores(int []); // Получение массива

Деструктор

// Установка промежуточных оценок
void set_scores(int []);
// Получение массива

с промежуточными оценками
int *get_scores();
// Получение строки с промежуточными оценками
std::string get_scores_str(char);
Слайд 41

Деструктор // Установка среднего балла void set_average_ball(float); // Получение среднего балла

Деструктор

// Установка среднего балла
void set_average_ball(float);
// Получение среднего балла

float get_average_ball();
private:
// Промежуточные оценки
int scores[5];
Слайд 42

Деструктор // Средний балл float average_ball; // Имя std::string name; // Фамилия std::string last_name; };

Деструктор

// Средний балл
float average_ball;
// Имя
std::string name;
// Фамилия

std::string last_name;
};
Слайд 43

Деструктор И определим эти функции в students.cpp. /* students.cpp */ #include #include #include "students.h"

Деструктор

И определим эти функции в students.cpp.
/* students.cpp */
#include
#include
#include "students.h"

Слайд 44

Деструктор // Деструктор Students Students::~Students() { Students::save(); }

Деструктор

// Деструктор Students
Students::~Students()
{
Students::save();
}

Слайд 45

Деструктор // Запись данных о студенте в файл void Students::save() {

Деструктор

// Запись данных о студенте в файл
void Students::save()
{
std::ofstream fout("students.txt", std::ios::app);

fout << Students::get_name() << " "
<< Students::get_last_name() << " ";
for (int i = 0; i < 5; ++i) {
fout << Students::scores[i] << " ";
}
fout << std::endl;
fout.close();
}
Слайд 46

Деструктор // Конструктор Students Students::Students(std::string name, std::string last_name) { Students::set_name(name); Students::set_last_name(last_name); }

Деструктор

// Конструктор Students
Students::Students(std::string name, std::string last_name)
{
Students::set_name(name);
Students::set_last_name(last_name);
}

Слайд 47

Деструктор // Установка имени студента void Students::set_name(std::string student_name) { Students::name = student_name; }

Деструктор

// Установка имени студента
void Students::set_name(std::string student_name)
{
Students::name = student_name;
}

Слайд 48

Деструктор // Получение имени студента std::string Students::get_name() { return Students::name; }

Деструктор

// Получение имени студента
std::string Students::get_name()
{
return Students::name;
}

Слайд 49

Деструктор // Установка фамилии студента void Students::set_last_name(std::string student_last_name) { Students::last_name = student_last_name; }

Деструктор

// Установка фамилии студента
void Students::set_last_name(std::string student_last_name)
{
Students::last_name = student_last_name;
}

Слайд 50

Деструктор // Получение фамилии студента std::string Students::get_last_name() { return Students::last_name; }

Деструктор

// Получение фамилии студента
std::string Students::get_last_name()
{
return Students::last_name;
}

Слайд 51

Деструктор // Установка промежуточных оценок void Students::set_scores(int scores[]) { int sum

Деструктор

// Установка промежуточных оценок
void Students::set_scores(int scores[])
{
int sum = 0;
for

(int i = 0; i < 5; ++i) {
Students::scores[i] = scores[i];
sum += scores[i];
}
}
Слайд 52

Деструктор // Получение массива с промежуточными оценками int *Students::get_scores() { return Students::scores; }

Деструктор

// Получение массива с промежуточными оценками
int *Students::get_scores()
{
return Students::scores;
}

Слайд 53

Деструктор // Установка среднего балла void Students::set_average_ball(float ball) { Students::average_ball = ball; }

Деструктор

// Установка среднего балла
void Students::set_average_ball(float ball)
{
Students::average_ball = ball;
}

Слайд 54

Деструктор / Получение среднего балла float Students::get_average_ball() { return Students::average_ball; }

Деструктор

/ Получение среднего балла
float Students::get_average_ball()
{
return Students::average_ball;
}

Слайд 55

Слайд 56

Слайд 57

Слайд 58

Слайд 59

Слайд 60

Слайд 61

Слайд 62

Слайд 63

Слайд 64

Слайд 65

Слайд 66

Слайд 67

Слайд 68

Слайд 69

Слайд 70

Слайд 71

Слайд 72

Слайд 73

Слайд 74

Слайд 75

Слайд 76

Слайд 77

Слайд 78

Слайд 79

Слайд 80

Слайд 81

Слайд 82

Слайд 83

Слайд 84

Слайд 85

Слайд 86

Слайд 87

Слайд 88

Слайд 89