5. Конструкторы в целом.

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

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

6. Деструкторы

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

То есть деструктор любого класса имеет такую форму:

class ANY_CLASS

{

public:

ANY_CLASS(); //конструктор по умолчанию

ANY_CLASS(int d); //еще один конструктор

~ANY_CLASS(); //а это - деструктор

};

Деструктор почти всегда вызывается неявно. Вызов деструктора происходит либо при выходе объекта за пределы своей области видимости, либо при уничтожении динамического созданного (операцией new) объекта операцией delete.

7. Виртуальный деструктор.

Если класс может иметь наследников, то предпочтительнее использовать виртуальный деструктор. Синтаксис виртуального деструктора точно такой же, как и у любого другого деструктора, за исключением того, что его объявление начинается с ключевого слова virtual.

class ANY_CLASS

{

public:

ANY_CLASS(); //конструктор по умолчанию

vrtual ~ANY_CLASS(); //а это - виртуальнный деструктор

};

Объявление деструктора виртуальным не отразится на производительности. Так что имеет смысл всегда делать его виртуальным, если нет очень веских причин воздержаться от этого.

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

Приведенный ниже пример придуман исклю

include "iostream.h"

// Этот класс просто демонстрирует неявные вызовы

// конструктора и деструктора

class DEMO

{

public:

DEMO() { cout " "constructor" " endl; }

virtual ~DEMO() { cout " "destructor" " endl; }

};

void main(void)

{

DEMO staticDemo; // статическое размещение, деструктор вызывается при

// выходе за пределы области видимости

DEMO *dynamicDemo = new DEMO;

// динамическое размещение,

// деструктор вызывается при уничтожении объекта

delete dynamicDemo;

}

В этом примере определяется класс, не содержащий ничего, кроме открытых (public) деструктора и конструктора. Обе этих функции объявлены и определены в классе. При создании объекта неявно вызывается конструктор и печатается слово "constructor", а при вызове деструктора, соответственно, слово "destructor".

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

constructor

constructor

destructor

destructor

Первая строка выводится конструктором при создании объекта staticDemo.

Вторая строка выводится конструктором при создании объекта dynamicDemo.

Третья строка - результат вызова деструктора объекта dynamicDemo при его уничтожении оператором delete.

Четвертая строка - результат вызова деструктора объекта staticDemo.

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

8. Операция присваивания.

Задача операции присваивания для класса состоит в том, чтобы дать вам возможность сделать один объект эквивалентным другому. Сама операция представляет из себя знак равенства (=). Присваивание настолько важно, что если вы сами не реализуете его, компилятор сделает это за вас.

Вспомните: мы уже говорили о том, что для каждого создаваемого класса вы должны принимать во внимание конструктор по умолчанию, конструктор копий, операцию присваивания и деструктор. Иногда имеет смысл воспользоваться предопределенными конструктором копий и операцией присваивания - то есть теми их версиями, которые автоматически генерируются компилятором.

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

9. Указатель на самого себя: this

Напоследок рассмотрим еще одно понятие - указатель на самого себя, поскольку в дальнейшем материале мы будем использовать это понятие.

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

Каждый объект класса имеет свой физический адрес и его можно извлечь из указателя this. Это внутренний (как бы скрытый от "прямого взгляда") указатель, который есть у каждого класса. На самом деле мы всегда неявно используем указатель this, когда обращаемся к членам внутри области видимости функции-члена класса. Вот пример:

сlass THIS_DEMO

{

public:

THIS_DEMO(){ this->a = 5; } //обычно мы просто пишем а=5;

... //все остальное

private:

int a;

};

Имеется класс, в котором описан конструктор и член класса int a в закрытой секции (private) класса. В конструкторе THIS_DEMO содержится присваивание целочисленному члену а значения 5. Обычно this явно не указывается, просто пишут а = 5;. Но в данном случае мы демонстрируем, то, что всегда неявно происходит - использование this внутри функций-членов класса при обращении к членам класса.

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

Ну вот, на этот раз все.

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

Если вам интересно, или возникают вопросы - пишите, разберемся.

Список литературы

P.Kimmel Using Borland C++ 5 Special Edition перевод BHV - С.Петербург 1997

Для подготовки данной работы были использованы материалы с сайта http://my-pc.jino.ru/


Информация о работе «Элементы класса, о которых всегда необходимо помнить»
Раздел: Информатика, программирование
Количество знаков с пробелами: 13714
Количество таблиц: 0
Количество изображений: 0

Похожие работы

Скачать
15188
0
0

... копирования; Копирование буквальное и развернутое; Когда выполняется копирование; Разница между копированием и присваиванием Положение в классах Блокирование копирования и присваивания Реализация копирования через присваивание Копирование и присваивание в производных классах Понятие копирования Здесь мы поговорим об одном из аспектов внутреннего функционирования программ, ...

Скачать
74657
3
0

... умений и навыков при работе с глиной и пластилином, особенностей обучения навыкам лепки нами были посещены занятия по ручному труду в 1-2 классах специальной коррекционной школы по разделу лепка. Занятия были проведены соответственно программе с использованием различных методов и приёмов обучения детей лепке. Проанализировав посещённые занятия во 2 "Б" и 2 "В" классах, можно прийти к выводу, ...

Скачать
108854
0
0

... содержание курса литературы ВОВ в 8 и 9 классе. Оно не слишком объемно и в основном нацелено на расширенный курс литературы о войне в старших классах. Но уже из этого проистекают некоторые проблемы. К рассмотрению проблем изучения литературы Великой Отечественной Войны мы сейчас и обратимся. Прежде всего, как уже говорилось немного выше, мы можем выделить проблемы, связанные непосредственно с ...

Скачать
257002
0
22

... быть выведены на печать. На экране рисунки могут быть статическими (неподвижными) или динамическими (движущимися). В последнее время машинная графика выделилась в самостоятельный раздел информатики с многочисленными приложениями. Средствами машинной графики создается не только печатная продукция, но и рекламные ролики на телевидении, мультфильмы. Объясним, как кодируется изображение в памяти ...

0 комментариев


Наверх