Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга C++.doc
Скачиваний:
24
Добавлен:
10.11.2019
Размер:
2.48 Mб
Скачать

Конструкторы и деструкторы Инициализация объектов класса: конструкторы

Часто во время создания объекта его элементам необходимо присвоить начальные значения. Сделать это непосредственно в определении класса нельзя, например, следующее описание приведет к ошибке компиляции:

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).