- •25. Понятие объекта и класса.
- •Определение методов класса
- •Переопределение операций
- •Подписи методов и необязательные аргументы
- •Запись классов
- •26. Скрытие данных и общий интерфейс.
- •27. Конструкторы и деструкторы Инициализация объектов класса: конструкторы
- •Основное назначение конструкторов - инициализация объектов.
- •Использование конструкторов с аргументами по умолчанию
- •Если параметры не передаются конструктору, в определении объекта не нужно включать пустые круглые скобки.
- •Использование деструкторов
- •Когда вызываются конструкторы и деструкторы.
- •28. Перегрузка классов.
- •Перегрузка операторов плюс и минус
- •Второй пример
- •Операторы, которые Вbl he можете перегрузить
- •29. Дружественные классы.
- •30. Наследование.
- •Внутреннее и защищенное наследование
- •Виртуальное наследование
- •31. Множественное наследование.
- •32. Полиморфизм.
- •33. Виртуальная функция.
- •34. Передача данных по умолчанию.
- •39. Создание и уничтожение динамических объектов.
- •40. Динамические библиотеки (dll).
26. Скрытие данных и общий интерфейс.
27. Конструкторы и деструкторы Инициализация объектов класса: конструкторы
Часто во время создания объекта его элементам необходимо присвоить начальные значения. Сделать это непосредственно в определении класса нельзя, например, следующее описание приведет к ошибке компиляции:
class my_Time {
public:
int hours = 0; // ошибка
int minutes = 0; // ошибка
};
С другой стороны, если не присвоить начальные значения элементам hours (часы) и minutes (минуты), то может возникнуть ситуация, когда при выводе на экран времени, получим, например, следущее:
-858993460:-834562789
Избежать подобную ситуацию можно, например, написав функцию, которая будет присваивать нулевые значения элементам hours и minutes, и вызывать эту функцию каждый раз сразу после объявления объекта. Но в языке С++ есть такой механизм как конструкторы. Конструктор (construct - создавать) - это специальная функция-член класса с тем же именем, что и класс. Таким образом, конструктор - это функция, но в соответствии с синтаксисом языка С++ для конструктора не определяется тип возвращаемого значения. Нельзя указывать даже void (конструктор никогда не возвращает значение).
Пример конструктора:
my_Time() { hours = 0; minutes = 0; }
Тогда описание класса my_Time будет следующее:
class my_Time {
public:
// данные-члены класса
int hours;
int minutes;
// конструктор имеет то же имя, что и класс
my_Time() { hours = 0; minutes = 0; }
};
Конструктор автоматически вызывается при создании объекта (создании экземпляра класса), т.е не нужно специально вызывать конструктор - это сделает компилятор. Например, определим объект time1 типа my_Time,
my_Time time1;
здесь при создании объекта автоматически вызывается конструктор my_Time();. Таким образом, проинициализировать объект можно в конструкторе.
Основное назначение конструкторов - инициализация объектов.
Типичная ошибка программирования. Попытка объявить тип возвращаемого значения для конструктора или возвратить значение из конструктора.
С помощью параметров конструктору можно передать любые данные, необходимые для инициализации объектов класса.
Рассмотрим небольшой пример. Опишем класс Точка (Point), который будет содержать координаты точки в двумерной системе координат, функцию вывода координат точки на экран, функцию смещения точки относительно нового центра координат. Затем, просто создадим одну точку и выведем ее координаты на экран. После пересчитаем координаты точки относительно нового центра и снова выведем данные на экран.
#include <iostream.h>
// описание класса Point
class Point {
int x, y; // координаты точки, по умолчанию имеют
// уровень доступа private
public:
// конструктор присваивает переменным класса x и y начальные
// значения соответственно x0 и y0
Point(int x0, int y0)
{
x = x0;
y = y0;
}
// функция вывода координат точки на экран
void ShowPoint()
{
cout << "\nx = " << x;
cout << "\ny = " << y;
}
// функция пересчета координат точки относительно нового центра
// с координатами в точке (x0, y0)
void OffsetXY(int x0, int y0)
{
x -= x0;
y -= y0;
}
};
void main()
{
Point A(1,3); // создаем точку А (объект типа Point)
// с координатами x = 1, y = 3 (вызывается конструктор Point(1, 3)
A.ShowPoint(); // выводим координаты точки А на экран
A.OffsetXY(2,2); // переносим центр координат в точку (2,2)
A.ShowPoint(); // показываем новые координаты точки А
}
Обратите внимание, при определении объекта значения параметров передаются конструктору с использованием синтаксиса, подобного обычному вызову функции.
Point A(1,3);
Такое определение создает экземпляр A класса Point, вызывая конструктор класса с параметрами (1,3).