Similar presentations:
Классы в C++. Конструкторы
1.
Классы в C++. Конструкторы1
2.
1. Конструкторы и деструкторыЧтобы обеспечить должную инициализацию каждого объекта, разработчик класса должен включить в него
специальную функцию, которая называется конструктором.
Имя конструктора должно совпадать с именем класса. Конструктор предназначен для инициализации полей объекта
начальными значениями, он вызывается в момент создания объекта. В примере 1 реализованы два конструктора – без
параметров и с параметрами:
circle(); //без параметров – конструктор по умолчанию
circle(double x1, double y1, double r1); //конструктор с параметрами
Конструктор без параметров называется конструктором по умолчанию.
Если в дальнейшем предполагается размещать объекты класса в массиве или в любом другом контейнере,
необходимо объявлять конструктор по умолчанию.
В случае если не описан явно ни один конструктор, компилятор автоматически (неявно) сгенерирует конструктор
по умолчанию. Поведение неявно созданного конструктора будет таким же, как если бы он был объявлен явно без
списка параметров и с пустым телом. Когда программа достигает точки выполнения, в которой определяется
объект circle a,b(0,0,1); происходит автоматический вызов конструктора.
2
3.
1. Конструкторы и деструкторыСинтаксис деструктора в целом схож с синтаксисом конструктора:
имя функции тоже определяется именем класса.
Но чтобы деструктор отличался от конструктора, его имя начинается с префикса ~ (тильда). Кроме того, деструктор
всегда один и у него нет аргументов.
В случае отсутствия явного задания деструктора, компилятор неявно создаёт деструктор с пустым телом.
Деструктор автоматически вызывается компилятором при выходе объекта из области видимости или при уничтожении
объекта, размещённого в динамической памяти.
При этом очищается память, занимаемая объектом.
Если перед уничтожением объекта необходимо освободить используемые ресурсы (например, динамическую память для
размещения полей объекта, открытые файлы и т.д.), то необходимо явно определить деструктор, выполняющий эти
действия.
Конструкторы и деструкторы обладают одной уникальной особенностью: они не имеют возвращаемого
значения. В этом они принципиально отличаются от функций, возвращающих пустое значение (значение типа
void).
3
4.
1. Конструкторы и деструкторыПример 1. Реализовать два класса для описания геометрических фигур «круг» и «прямоугольник».
Описать функцию, позволяющую совместить центры круга и прямоугольника (переместить круг), если круг можно
поместить в прямоугольник
Реализуем все по шагам:
1. Создадим новый проект Geometria, пока по-прежнему консольный.
2. Добавим класс shape.
4
5.
1. Конструкторы и деструкторыСоздадим 2 класса circle и rectangle, с учетом разделения данных от логики.
Файл shape.h.
5
6.
1. Конструкторы и деструкторыФайл shape.cpp.
6
7.
1. Конструкторы и деструкторыФайл main.cpp.
7
8.
1. Конструкторы и деструкторы1. Конструктор должен быть public
2. Мы не можем его вызвать сами, через Объект.Метод()
8
9.
1. Конструкторы и деструкторыВ заголовочном файле shape.h размещены описания двух классов
circle и rectangle, а их определения в файле shape.cpp.
В конструкторе с параметрами для класса rectangle возникает ситуация, когда имена параметров совпадают с именами
переменных-членов
класса. Для разрешения коллизии имён используется ключевое слово
this.
rectangle::rectangle(double x1,double y1,double x2,double y2 ){
this->x1 = x1;
this->y1 = y1;
this->x2 = x2;
this->y2 = y2;
}
Ключевым словом this обозначается указатель на объект в функциях-членах класса. Если коллизии имён не возникают, то
при обращении к членам класса его обычно опускают. Указатель на объект передаётся как неявный параметр во все
функции, которые могут вызываться только для экземпляров классов (в том числе, конструкторы и деструкторы).
9
10.
2. Перегрузка функций в C++В C ++ несколько определений функций могут иметь одно и то же имя, но с разными параметрами. Это называется
перегрузкой функции. С помощью функции перегрузки функций полиморфизм времени компиляции может быть
достигнут в C ++.
Функции могут быть перегружены следующими способами:
• Количество параметров может быть разным.
• Тип данных параметров может быть разным.
• Последовательность параметров может быть разной.
Однако возвращаемое значение не учитывается при перегрузке функции.
Перегружены следующие функции:
• int сложение (int a, int b)
• добавление поплавка (float f, gloat g)
• сложение с плавающей запятой (float f, int i)
• сложение с плавающей запятой (int i, float f)
• int сложение (int a, int b, int c)
• добавление поплавка (float f, float g, float h)
10
11.
2. ПолиморфизмСлово полиморфизм греческого происхождения и означает «имеющий много форм».
Полиморфизм — это свойство, которое позволяет одно и то же имя использовать для решения нескольких технически
разных задач. Применительно к ООП целью полиморфизма является использование одного имени для задания общих
для класса действий. На практике это означает способность объектов выбирать внутреннюю процедуру (метод) исходя
из типа данных, принятых в сообщении.
Например, объект «Print» (печать) может получить сообщение, содержащее двоичное целое число, двоичное число с
плавающей точкой или символьную строку.
В более общем смысле, концепцией полиморфизма является идея «один интерфейс — множество методов». Это
означает, что можно создать общий интерфейс для группы близких по смыслу действий. Преимуществом полиморфизма
является то, что он помогает снижать сложность программ, разрешая использование одного интерфейса для единого
класса действий. Выбор конкретного действия в зависимости от ситуации возлагается на компилятор.
Таким образом, полиморфизм означает присваивание действию одного имени или обозначения, которое совместно
используется объектами различных типов, при этом каждый объект реализует действие способом, соответствующим его
типу.
Полиморфизм напрямую связан с механизмом позднего связывания. Решение о том, какая операция должна быть
выполнена в конкретной ситуации, принимается во время выполнения программы.
11
12.
2.1. Перегрузка функций в C++Как видите, с помощью функции перегрузки функций в C ++ может быть несколько определений / функций с одним и
тем же именем функции и в одной области.
Без функции перегрузки функций вам нужно было бы написать отдельную функцию [например, add_1 (), addition_2 () и
т. Д.] Для каждого варианта. Например, вам может потребоваться написать add_1 (), чтобы добавить два целых числа,
add_2 (), чтобы добавить два числа с плавающей запятой, и так далее. Однако, как вы можете видеть выше, функцию
перегрузки функции можно использовать для определения нескольких вариантов функции «add ()», сохраняя при этом то
же имя функции.
Следующие функции не считаются перегруженными, поскольку единственное различие между ними — это тип
возвращаемого значения (тип возвращаемого значения не учитывается при перегрузке функций в C ++):
int сложение (int a, int b)
сложение с плавающей запятой (int a, int b)
12
13.
ПримерыТеперь, когда вы понимаете концепцию перегрузки функций, мы рассмотрим несколько рабочих примеров программ,
чтобы лучше понять эту концепцию. Мы рассмотрим следующие примеры:
Пример 1: простая функция
Пример 2: Простая функция сложения
Пример 3: Перегрузка функции (1)
Пример 4: Перегрузка функции (2)
Пример 5: Функциональная перегрузка (3)
Первые два примера объясняют, как обычные функции работают в C ++, а последние три примера демонстрируют
возможность перегрузки функций в C ++.
13
14.
Пример 1: простая функцияВ этом примере мы продемонстрируем, как можно определить и вызвать простую функцию в C ++. Мы определим
класс под названием «Display» и общедоступную функцию под названием «display ()». Из функции «main ()» мы
вызовем функцию «display ()» с помощью объекта класса «Display» (d).
14
15.
Пример 2: Простая функция сложенияВ этом примере мы продемонстрируем, как определить простую функцию «сложение ()» в C ++. Мы определим
класс под названием «DemoAdd» и общедоступную функцию под названием «add ()». Из функции «main ()» мы
вызовем функцию «add ()» с помощью объекта класса «DemoAdd» (d).
В этом примере текущая реализация функции «сложение ()» принимает только два целочисленных параметра.
Это означает, что текущая функция «сложение ()» способна складывать только два целых числа.
Чтобы добавить три целых числа вместо двух, можно определить функцию с другим именем, например, «add_1
()». В C ++ функция может быть перегружена, что означает, что может быть определено другое определение
функции «add ()» для добавления трех целых чисел с сохранением того же имени, то есть «add ()». В следующем
примере мы рассмотрим, как перегрузить функцию «сложение ()».
15
16.
Пример 3: Перегрузка функции (1)В предыдущем примере мы определили функцию «сложение ()», чтобы складывать два целых числа и
возвращать вычисленный результат. Теперь в этом примере мы перегрузим функцию «сложение ()», чтобы
добавить три целых числа. Таким образом, мы сможем вызывать функцию «сложение ()» с двумя
целочисленными аргументами, а также с тремя целочисленными аргументами.
Без функции перегрузки функций нам пришлось бы написать другую функцию с другим именем.
16
17.
Пример 4: Перегрузка функции (2)В предыдущих разделах этой статьи вы узнали, что перегрузка функций может выполняться на основе различий
в типах параметров. Здесь мы перегрузили функцию «сложение ()» в зависимости от типа данных параметра. В
первой версии функции сложения мы добавим две переменные целочисленного типа; а во второй версии мы
добавим две переменные типа float.
17
18.
Пример 5: Функциональная перегрузка (3)В этом примере функция «сложение ()» перегружена из-за различий в последовательности списка параметров.
Это еще один способ перегрузить функцию в C ++.
18
19.
Работа с перегруженной функциейПопробуйте на практике перегрузить функцию умножения
19
20.
3. Перегрузка конструкторовПример реализации перегрузки конструктора мы можем видеть в классе circle.
Объект circle может создаваться как с определенными координатами, так и с координатами по умолчанию.
20
21.
4. ДеструкторДеструктор противоположен по назначению конструктору. Он срабатывает при разрушении объекта класса.
Как и конструктор он не может быть вызван явно.
Уничтожение объекта происходит например, когда мы выходим из зоны видимости. Например, мы вышли из
main, все объекты уничтожаются – вызываются деструкторы.
1. В отличии от конструкторов, деструктор в классе может быть только один, а конструкторы мы можем
перегружать.
2.иДеструктор не может быть с параметрами.
21
22.
4. ДеструкторВ нашем примере создадим деструктор для класса circle, проверить его работу можно добавив туда cout.
22
23.
4. ДеструкторМы можем проконтролировать запуск деструктора и с помощью отладки с точками останова в функции main и в
конструкторе с деструктором.
23
24.
4. ДеструкторУсложним пример, добавив в класс circle поле, которое будет хранить номер объекта и будем выводить его в
конструкторе и деструкторе, чтобы продемонстрировать их работу.
24
25.
4. Деструктор25
26.
4. ДеструкторЕще усложним пример, добавив:
1. Функцию example.
2. Создав в ней объекты класса circle c с разными конструкторами
26
programming