Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
50
Добавлен:
16.02.2016
Размер:
196.61 Кб
Скачать

Конструкторы и деструкторы. Список инициализации элементов

Создавая некоторый объект, его необходимо проинициализировать. Для этой цели C++ предоставляет функцию-член, которая называется конструктором. Конструктор класса вызывается вся­кий раз, когда создается объект его класса. Конструктор имеет то же имя, что и класс, членом которого он является, и не имеет воз­вращаемого значения. Например,

#include <iostream.h>

class AnyClass

{

int var;

public:

AnyClass(); //Конструктор

Void Show();

};

AnyClass:: AnyClass()

{

cout « 'В конcтрукторе\n';

var = 0;

}

void

AnyClass::Show()

{

cout « var;

}

Int main()

{

AnyClass ob;

ob.Show();

//...

return 0;

}

В этом примере конструктор класса AnyClass выводит со­общение на экран и инициализирует значение закрытой перемен­ной класса var.

Программист не должен писать код, вызы­вающий конструктор класса. Всю необходимую работу выпол­няет компилятор. Конструктор вызывается тогда, когда созда­ется объект его класса. Объект, в свою очередь, создается при выполнении оператора, объявляющего этот объект. Таким образом, в C++ оператор объявления переменной является вы­полнимым оператором.

Для глобальных объектов конструктор вызывается тогда, ко­гда начинается выполнение программы. Для локальных объектов конструктор вызывается всякий раз при выполнении оператора, объявляющего переменную.

Функцией-членом, выполняющей действия, обратные конст­руктору, является деструктор. Эта функция-член вызывается при удалении объекта. Деструктор обычно выполняет работу по освобождению памяти, занятой объектом. Он имеет то же имя, что и класс, которому он принадлежит, с предшествующим сим­волом ~ и не имеет возвращаемого значения. Рассмотрим пример класса, содержащего деструктор:

#include <iostream.h>

class AnyClass

{

int var;

public:

AnyClass(); //Конструктор

~AnyClass(); //Деструктор

void Show();

};

AnyClass::AnyClass()

{

cout « "Мы в конструкторе\n";

var = 0;

}

AnyClass::~ AnyClass()

{

cout « "Мы в деструкторе\n";

}

void

AnyClass::Show()

{

cout « var « "\n";

}

int main()

{

AnyClass ob;

ob.Show();

//...

return 0;

}

Деструктор класса вызывается в момент удаления объекта. Это означает, что для глобальных объектов он вызывается при завершении программы, а для локальных — когда они выходят из области видимости. Заметим, что невозможно получить указате­ли на конструктор и деструктор.

Обычно конструктор содержит параметры, которые позво­ляют при построении объекта задать ему некоторые аргумен­ты. В рассмотренном выше примере конструктор инициализи­ровал закрытую переменную var класса AnyClass значени­ем 0. Если нужно проинициализировать переменные класса, используется конструктор с параметрами. Модифицируем предыдущий пример:

#include <iostream.h>

class AnyClass

{

int a, b;

public:

//Конструктор с параметрами

AnyClass(int x, int y);

//Деструктор

~AnyClass();

Void Show();

};

AnyClass::AnyClass(int x, int y)

{

cout « "Мы в конструкторе\n";

a = x;

b = у;

}

AnyClass::~ AnyClass()

{

cout « "Мы в деструкторе\n";

}

void

AnyClass::Show()

{

cout « a « ' ' « b « "\n";

}

Int main()

{

AnyClass ob(3,7);

ob.Show();

//...

return 0;

}

Здесь значение, переданное в конструктор при объявлении объекта ob, используется для инициализации закрытых перемен­ных а и b этого объекта.

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

Приведем правила, которые существуют для конструкторов:

для конструктора не указывается тип возвращаемого зна­чения;

конструктор не может возвращать значение;

конструктор не наследуется;

конструктор не может быть объявлен с модификатором const, volatile, static или virtual.

Если в классе не определен конструктор, компилятор генери­рует конструктор по умолчанию, не имеющий параметров.

Для деструкторов существуют следующие правила:

деструктор не может иметь параметров;

деструктор не может возвращать значение;

деструктор не наследуется;

класс не может иметь более одного деструктора;

деструктор не может быть объявлен с модификатором const, volatile, static или virtual.

Если в классе не определен деструктор, компилятор генериру­ет деструктор по умолчанию.

Таким образом, конструкторы и деструкторы в C++ вы­зываются автоматически, что гарантирует правильное создание и удаление объектов класса.

Обычно данные-члены класса инициализируются в теле конструктора, однако существует и другой способ инициали­зации — с помощью списка инициализации элементов. Список инициализации элементов отделяется двоеточием от заголовка определения функции и содержит данные-члены и базовые классы, разделенные запятыми. Для каждого элемента в круг­лых скобках непосредственно за ним указывается один или несколько параметров, используемых при инициализации. В следующем примере для инициализации класса используется список инициализации элементов.

class AnyClass()

{

int a, b;

public:

AnyClass(int x, int y);

};

//Конструктор использует список инициализации

AnyClass::AnyClass(int x, int y): a(x), b(y)

{

//…

}

Хотя выполнение инициализации в теле конструктора или с помощью списка инициализации — дело вкуса программиста, список инициализации является единственным методом инициа­лизации данных-констант и ссылок. Если членом класса является объект, конструктор которого требует задания значений одного или нескольких параметров, то единственно возможным спосо­бом его инициализации также является список инициализации.

Соседние файлы в папке ЛекцииКарасева