Инициализация конструкторов класса
Объекты классов с конструкторами могут быть инициализированы следующими способами.
Первый – при помощи задаваемого в круглых скобках списка выражений, который используется как список передаваемых конструктору аргументов.
Второй – использование знака присваивания (=), за которым следует отдельное значение. Оно может иметь тип первого аргумента, принимаемого конструктором данного класса, в этом случае дополнительных аргументов либо не существует, либо они имеют значения по умолчанию. В этом случае для создания объекта вызывается соответствующий конструктор. Значение может также являться объектом данного типа класса. В таком случае вызывается конструктор копирования, инициализирующий объект.
Пример 11.
Демонстрация работы конструктора и деструктора в программе.
#include<iostream.h>
#include<conio.h>
class Number // описание класса
{ int i; // элемент private
public: // прототипы методов класса
Number (int j); // объявление конструктора
~Number(); // объявление деструктора
void show(); // вывод на экран
};
Number :: Number (int i) // заголовок конструктора
{ i=j; // инициализация элемента данных класса
cout<<"Работает конструктор: i="<< i <<'\n';
}
Number :: ~Number() // заголовок деструктора
{ cout<<"Работает деструктор: i="<< i <<'\n';
}
void Number :: show() // метод вывода данных на экран
{ cout<<"i= "<< i <<'\n';
}
void main() // главная функция
{ clrscr(); // чистка экрана результатов
Number ob1(25); // вызов конструктора и создание объектов
Number ob2(5);
cout<<"Вывод из объекта ob1: ";
ob1.show(); // вывод данных объекта
cout<<"Вывод из объекта ob2: ";
ob2.show();
}
Результаты программы:
Работает конструктор: i=25
Работает конструктор: i=5
Вывод из объекта ob1: i=25
Вывод из объекта ob1: i=5
Работает деструктор
Работает деструктор
Объекты класса могут объявляться (значит, и создаваться) сразу после описания класса до точки с запятой. Конструктор может иметь любое число параметров. Например, он может принимать в качестве аргумента имя самого объекта.
Пример 12.
Демонстрация работы программы с объектом, созданным встроенным конструктором до начала действий функции main(). Имя объекта является параметром конструктора. Показан порядок конструирования объектов и разрушения встроенным деструктором.
#include<iostream.h>
#include<conio.h>
class Number1 // описание класса
{ char *str; // указатель на строку
public:
Number1 (char *name) // встроенный конструктор
{ cout<<"Создан объект с именем " <<name<<" класса Number1\n";
str = name; // присваивание имени элементу str класса
}
~Number1 // встроенный деструктор
{ cout<< "Объект " << str <<" разрушен\n";
}
} one ("one"); // создание объекта one с инициализацией
void main()
{ // clrscr(); // после чистки экрана не виден объект one
Nimber1 two (two); // вызов конструктора для объекта two
// getch(); // при задержке не видно работы деструктора
}
Результаты программы:
Создан объект с именем one класса Number1
Создан объект с именем two класса Number1
Объект two разрушен
Объект one разрушен
Комментарий к программе.
Для статических объектов память распределяется компилятором: конструктор вызывается перед main, а деструктор – после main. Если конструктор не определен, С++ использует неявный или встроенный. В случае автоматических объектов освобождение памяти происходит, когда нарушается область действия (заканчивается включающий блок). Любой определенный программистом деструктор вызывается, когда уничтожаются статические или автоматические объекты.
В примере компилятор автоматически вызвал конструктор при входе в программу для создания элемента локального статического объекта one. При создании автоматического объекта two конструктор был вызван явно. При выходе из функции main() завершается область определения объекта two и компилятор неявно вызывает деструктор. Второй раз деструктор вызывается при завершении всей программы для разрушения объекта one. Таким образом, разрушение объектов деструктором выполняется в порядке обратном их созданию конструктором.