Теоретические сведения для студентов специальностей «Экономика и организация производства», страница 13

Отметим, что аналогично языку С, можно объявлять и использовать указатель на тип класс (признак указателя знак "*" в объявлении переменной).

Point * ptr2;           //объявление указателя ptr2 на тип Point;

ptr2=&P1;    // присваивание указателю ptr2 адреса расположения в

//памяти объекта P1, объявленного ранее

Теперь можно применять операцию выбора метода через операции "." или "->".

Ptr->GetX();           //вызов метода GetX() для объекта P1, соответствует

// вызову P1.GetX();

Тема 3. КОНСТРУКТОРЫ И ДЕСТРУКТОРЫ

В предыдущем примере мы использовали значения частных переменных X,Y,C для рисования точки при помощи функции putpixel(), не задаваясь вопросом, каким образом будет осуществляться инициализация (присваивание значений) названных переменных. Один из возможных способов передать необходимые значения частным переменным – через какой-либо из методов класса, объявленный как public. Это может быть, например, метод show(), объявленный в классе следующим образом:

void show(int K,int L,int M);

Вне класса метод мог бы иметь следующий код:

void Point::show(int K,int L,int M)

{ X=K; Y=L; C=M;  putpixel(X,Y,C); }

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

В С++ имеется два специальных типа методов – конструкторы и деструкторы, определяющие, каким образом объекты класса создаются, инициализируются, копируются и разрушаются. Конструкторы и деструкторы обладают большинством характеристик обычных методов, но имеют и ряд особенностей.

Рассмотрим функцию, называемую конструктором.

Конструктор имеет следующие отличительные особенности:

·  всегда выполняется при создании нового объекта класса, т.е. когда под объект отводится память и когда он инициализируется;

·  может определяться пользователем, либо создаваться С++ по умолчанию;

·  не может быть вызван явно из пределов программы (не может быть вызван как обычный метод). Он вызывается явно компилятором при создании объекта и неявно при выполнении оператора new (данный оператор используется при динамическом распределении памяти под объект) для выделения памяти объекту или при копировании объекта;

  • имеет всегда то же имя, что и класс, в котором он определен;
  • никогда не должен возвращать значения (не может описываться с каким-либо типом возврата, даже void). Он всегда вызывается при объявлении экземпляра некоторого класса (т.е. при создании объекта);
  • не наследуется;
  • не может быть объявлен как const, virtual или static.

Противоположные действия, по отношению к действиям конструктора, выполняют функции-деструкторы (destructor), или разрушители, которые уничтожают объект. Например: конструктор может выделить память для объекта, а деструктор - освободить ее. Аналогично конструктору деструктор может вызываться явно или неявно. Неявный вызов деструктора связан с прекращением существования объекта из-за завершения области его определения. Например, объект локальный внутри функции (объявленный внутри функции), и функция возвращает управление (завершается). Явное уничтожение объекта выполняет оператор delete. Компилятор генерирует деструктор по умолчанию, если он не объявлен в программе. Деструктор имеет такое же имя, как и класс, но перед именем записывается знак тильда (~).

Кроме того, деструктор не может:

·  иметь аргументы или возвращать значение;

·  наследоваться;

·  объявляться как const или static, но может быть объявлен как virtual.

Рассмотрим пример простой программы, демонстрирующей работу конструктора и деструктора.

// РАБОТА КОНСТРУКТОРА И ДЕСТРУКТОРА

#include<iostream.h>

//подключение системного файла с описанием функций ввода-вывода потоком

#include<string.h>

//системный файл с описаниями функций работы со строками

class string { int i;           public: