Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lections_rus.doc
Скачиваний:
31
Добавлен:
06.02.2016
Размер:
1.41 Mб
Скачать

Тема 3. Конструкторы и деструкторы (2 часа).

Конструкторы и деструкторы. Пример программы, демонстрирующей последовательность их работы.

3.1. Для чего нужны конструкторы

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

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 {

private:

// данные-члены класса

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]