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

Инициализация объектов класса

Объекты классов с конструкторами могут инициализироваться при помощи задаваемых в круглых скобках списков инициализаторов. Этот список используется как список передаваемых конструктору аргументов

main()

{

X one; // вызывается конструктор X::X() по умолчанию для объекта one

// класса Х

X two(1); // используется конструктор X::X(int)

X three = 1; // вызывается X::X(int) – альтернативная форма со знаком (=)

Х three(10, 8) // использовать нельзя, неоднозначно задан конструктор

// X::X(int а=5, int b=6)

X four = one; // вызывается X::X(const X&) для копирования

// объекта one в four

X five(two); // вызывает X::X(cont X&) для копирования объекта two в five

}

Конструктор воспринимает значения в качестве параметров и выполняет присваивание данным членам в теле функции конструктора. Определение конструктора как и любой функции-члена может производиться в теле класса

class X

{

int i, j;

public:

X(int a, int b) { i = a; j = b } // определение конструктора в классе, он имеет

// доступ к i и j

X(int a, int b) : a(i), b(j) {} // альтернативная форма для инициализации а и b

}; i(a), j(b)

В обоих случаях инициализации X x(1, 2) присваивает значение x::i=1 и значение x::j=2.

Деструкторы

Деструктор класса вызывается для разрушения элементов объекта до уничтожения самого объекта. Деструктор представляет собой функцию-член, имя которой совпадает с именем класса, перед которым стоит символ тильды (~). Деструктор не может воспринимать каких-либо параметров, а также не объявляет возвращаемого типа или значения.

class X

{…

public:

X(); // деструктор класса X

};

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

Вызов деструкторов

Вызов деструктора выполняется неявно, когда объект выходит из своей объявленной области действия. Для локальных переменных деструкторы вызываются, когда перестает быть активным блок, в котором они объявлены. В случае глобальных переменных деструкторы вызываются как часть процедуры выхода после функции main(). Необходимость деструкторов в значительной степени связана с указателями и динамическим выделением памяти.

Когда указатели, связанные с объектами, выходят за пределы области действия, неявного вызова деструктора не происходит. Это значит, что для уничтожения такого объекта оператор delete должен задаваться явно.

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

При выходе из программы с использованием функции exit() деструкторы для каких-либо локальных переменных в текущей области действия не вызываются. Глобальные переменные уничтожаются в обычной последовательности.

При вызове abort() где-либо из программы деструкторы не вызываются даже для переменных глобальной области действия.

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

Примеры:

class X {

{...

X();

...

};

void* operator new(size_t size, void *ptr)

{

return ptr;

}

char buffer[sizeof(X)];

main()

{

X* pointer = new X; // память для

// объекта класса Х выделена в куче

X* exact_pointer;

exact_pointer =

(Х)new(sizeif (X)&buffer) X;

// указатель инициализируется адресом // буфера

...

delete pointer; // delete служит // для разрушения указателя

exact_pointer->X::-X(); // прямой вызов для отмены распределения // памяти

}

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