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.KimmelUsingBorlandC++ 5 SpecialEditionперевод BHV - С.Петербург 1997