Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_С++_последная.doc
Скачиваний:
42
Добавлен:
07.05.2019
Размер:
876.54 Кб
Скачать

8.2. Конструкторы и деструктор

Конструктор – это особый метод, имеющий имя, совпадающее с именем класса. Назначением конструктора является создание и инициализация объектов.

Количество и типы аргументов конструктора могут быть любые; конструктор может не иметь аргументов; аргументам разрешается присваивать значения по умолчанию; аргументы конструктора обычно используются для инициализации полей объекта. Конструктор не возвращает результата – нельзя писать даже void.

Заголовок конструктора, реализуемого вне класса, как и для обычного метода, должен сопровождаться префиксом:

класс::класс(параметры)

Конструкторы, так же как и обычные методы, можно перегружать. Обычно различают три вида конструкторов:

- конструктор без аргументов (конструктор по умолчанию);

- конструктор инициализации;

- конструктор копирования (с одним параметром определяемого класса).

При отсутствии в классе явно определенных конструкторов автоматически создаются конструктор без аргументов (конструктор по умолчанию) и конструктор копирования. Создаваемый автоматически конструктор без аргументов имеет вид:

класс::класс(){}

Конструктор копирования автоматически создается в таком виде:

класс::класс (const класс &r)

{ *this = r; }

Аргументом конструктора копирования всегда является объект своего класса. Эти конструкторы обеспечивают объявление объектов без инициализации и с инициализацией другим объектом того же типа:

date d; // конструктор без аргументов

date t(d); // конструктор копирования

date r = d; // конструктор копирования

При наличии хотя бы одного явно определенного конструктора конструктор без аргументов не создается. Конструктор копирования создается всегда, если не определен явно.

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

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

class time

{ public:

time(); // конструктор без аргументов

time (int h, int m = 0, int s = 0) // конструктор инициализации

{ hours = h; minutes = m; seconds = s; }

private:

int hours, minutes, seconds: // закрытые поля

};

time::time() // реализация вне класса

{ hours = minutes = seconds = 0; }

Конструктор инициализации обеспечивает объявление и инициализацию переменных:

time t(12,59,59), s(13,45), u = 14;

Конструктор инициализации может вызываться явно:

time R = time(10): // явный вызов конструктора

Конструктор инициализации со всеми аргументами по умолчанию играет роль конструктора без аргументов (конструктора по умолчанию).

Конструкторы вызываются и при создании динамических переменных:

time *a = new time; // конструктор без аргументов

time *b = new time(); // конструктор без аргументов

time *d = new time(12,23); // конструктор инициализации

time *f = new time(*d); // конструктор копирования

Конструкторы обеспечивают привычную форму объявления констант:

const time d2(100,67); // конструктор инициализации

const time d0 = 100; // конструктор инициализации

const time d5 = time(100); // явный вызов

Конструктор инициализации обеспечивает инициализацию массива:

time Т[3] - { 1,2,3 };

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

time T[0]=time(l);

time T[l]=time(2);

time T[2]=time(3);

Если массив не инициализируется, то для каждого элемента массива вызывается конструктор без аргументов, если он определен явно или неявно (или вызывается конструктор инициализации с аргументами по умолчанию).

Деструктор – это метод, имеющий имя класса, с тем отличием, что его первым символом должен быть символ - (тильда). Деструктор не возвращает результата и не имеет аргументов. Деструктор в классе может быть только один – перегрузка деструкторов запрещена. Деструктор вызывается автоматически при каждом уничтожении объекта. При отсутствии в классе явно определенного деструктора он создается автоматически. Вид автоматически создаваемого деструктора следующий:

класс::~класс(){}