В каждом классе языка C++ могут быть определены специальные
методы (один, или несколько), обращение к которым приводит к порождению нового
объекта этого класса. Такие методы называются конструкторами.
Конструкторы могут иметь параметры, что позволяет определить начальное состояние
объекта при его порождении. Конструкторы имеют то же имя, что и имя класса, в
котором они определены, так что если класс имеет несколько конструкторов, то они
должны различаться числом и типом своих параметров. В качестве примера
рассмотрим конструктор класса Window (см. рисунок 5.1): Window::Window (Length x0, Length y0,
Length width, Length height)
{
xmin = x0; ymin = y0;
xmax = x0 + width; ymax = y0 + height;
}
При обращении к этому конструктору порождается новое окно с
координатами нижнего левого угла (x0,y0), шириной width и высотой height. Наряду
с рассмотренным в этом классе могут быть определены и другие конструкторы: Window (Length x0, Length y0);//берутся стандартные размеры окна
Window (); //берутся стандартные размеры и положение окна
В языке C++ поддерживается три вида выделения памяти для
размещения объектов: в фиксированной глобальной памяти (статическая память,
static), в системном стеке (автоматическая память, automatic), в
"куче" (динамическая память, dynamtic).
Чтобы разместить объект в статической памяти достаточно либо
объявить его вне какой-либо функции, либо при его объявлении указать ключевое
слово static. Статическая память выделяется компилятором во время компиляции
программы и не меняется во время ее выполнения. Конструктор можно использовать
для инициализации объектов, размещаемых в статической памяти (для выделения
статической памяти под объект без его инициализации достаточно просто объявить
его). Объявление Window main_window = Window(0.0, 0.0, 8.5, 11.0)
определяет статический объект main_window (основное окно),
проинициализированный значениями параметров конструктора.
Локальные объекты, объявляемые внутри функций, размещаются в
автоматической памяти (системном стеке). Их тоже можно инициализировать с
помощью конструктора. Наконец, обращение к конструктору в операторе new в
процессе выполнения программы порождает объект, размещаемый в динамической
памяти. Например: Window *window = new Window (0.0, 0.0, 8.5, 11.0);
При этом выражение new Window (0.0, 0.0, 8.5, 11.0) имеет своим
значением указатель на порожденный динамический объект.
Для терминации объектов можно использовать специальный метод,
являющийся одним из членов класса и называемый деструктором. Как и
конструктор, он имеет то же имя, что и имя класса, в котором он определен, но
первым символом имени деструктора является тильда (~): Window::~Window ();
{
//убрать окно и перекрасить освободившуюся область
}
Наконец, для освобождения динамической памяти от объектов,
которые уже не нужны, используется операция delete, например: delete window;
Необходимость использования операции delete связана с тем, что
в системе C++ не производится сборки мусора, и программист должен сам заботиться
об освобождении динамической памяти от ненужных объектов, чтобы избежать ее
переполнения (в более современной системе программирования Java обеспечивается
автоматическая сборка мусора, что существенно упрощает программирование).
|