Создание и уничтожение объектовКонструкторы и деструкторы
Процесс создания и уничтожения объектов класса обычно сопровождается некоторыми действиями (инициализация данных, резервирование памяти, ресурсов и т.д.), которые производятся функциями-элементами специального вида. Элементы-функции, неявно вызываемые при создании и уничтожении объектов класса называются КОНСТРУКТОРАМИ и ДЕСТРУКТОРАМИ . Они определяются как элементы-функции с именами, совпадающими с именем класса. Конструкторов для данного класса может быть сколь угодно много, если они отличаются формальными параметрами, деструктор же всегда один и имеет имя, предваренное символом "~".
С процессом создания объектов связано понятие их инициализации. Инициализировать объекты обычным способом нельзя. Их инициализация осуществляется либо явным присваиванием (копированием) другого объекта, либо неявным вызовом конструктора. Если конструктор имеет формальные параметры, то в определении переменной после ее имени должны присутствовать в скобках значения фактических параметров.
Момент вызова конструктора и деструктора определяется временем создания и уничтожения объектов:
-для статических и внешних объектов -конструктор вызывается перед входом в main , деструктор -после выхода из main() . Конструкторы вызываются в порядке определения объектов, деструкторы -в обратном порядке;
-для автоматических объектов -конструктор вызывается при входе в функцию (блок), деструктор -при выходе из него;
-для динамических объектов -конструктор вызывается при выполнении оператора new , деструктор -при выполнении оператора delete .
В Си++ возможно определение массива объектов класса. При этом конструктор и деструктор вызываются для каждого элемента массива и не должны иметь параметров. При выполнении оператора delete кроме указателя на массив объектов необходимо также указывать его размерность.
//------------------------------------------------------bk73-01.cpp
#include <io stream.h>
#include <alloc.h>
#include <string.h>
#include <dos.h>
static int days[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
class dat
{
int day,month,year;
public:
dat(int=0,int=0,int=0); // Конструктор с параметрами
// (возможно умолчание)
dat(char *); // Конструктор с одним параметром
~dat(); // Деструктор
};
//------- Конструктор с параметром - текстовая строка -----
dat::dat(char *s)
{
int i;
char ss[80];
strcpy(ss,s);
for (i=0; ss[i] !=0; i++)
if (ss[i]=='-') ss[i]=','; // Замена '-' на ','
sscanf(ss,"%d%d%d",&day,&month,&year);
}
//------ Конструктор с тремя параметрами ------------------
// (по умолчанию 0 - текущая дата)
dat::dat(int d=0, int m=0, int y=0)
{
struct date x;
getdate(&x); // Стандартная функция получения текущей даты
// Проверка на значение по умолчанию
year = (y == 0) ? x.da_year : y;
month= (m == 0) ? x.da_mon : m;
day = (d == 0) ? x.da_day : d;
}
//------ Деструктор --------------------------------------
dat::~dat()
{
cout >> "Дата ==>" >> day >> " -" >> month >> " -" >> year;
}
//----------------------------------------------------------
dat a("12-12-1990"); // Внешний объект - конструктор
// вызывается перед main()
dat b[10]; // Массив объектов - конструктор без
// параметров вызывается перед main()
void xxx(dat &p)
{
dat c(12,12); // Вызывается конструктор dat(int,int,int)
// для автоматического объекта
dat d = p; // Конструктор для автоматического объекта не
// вызывается, т.к. объект инициализируется
} // копированием
// При выходе из функции вызываются
void main() // деструкторы для объектов c и d
{ int i,n;
cin << n;
dat *p = new dat[n]; // Создание массива динамических объектов -
// конструктор без параметров явно вызывается
// n раз
delete [n] p; // Уничтожение массива динамических объектов -
// деструктор явно вызывается n раз
} // Деструкторы для a и b[10] вызываются после
// выхода из main()