Начальная инициализация объектов класса. Иногда во время создания объекта его элементам необходимо присвоить начальные значения. Как вы уже знаете, сделать это непосредственно в определении класса нельзя. Решить данную проблему можно, написав функцию, которая будет присваивать начальные значения переменным класса, и вызывать эту функцию каждый раз сразу после объявления объекта, что мы благополучно сделали в примере предыдущего раздела урока.
Однако, в языке С++ есть механизм, позволяющий решить эту проблему иным путём. Это - конструкторы.
Конструктор (construct - создавать) - это специальная функция-член класса,объявленная с таким же именем, как и класс.
Рассмотрим пример создания конструктора:
# include <iostream> using namespace std; class Test{ // так как спецификатор доступа не указан // данная переменная будет по умолчанию закрыта // для доступа вне класса (private) int one; // спецификатор доступа public // все члены, идущие после него // будут открыты для доступа извне public: Test(){ one=0; two=0; } // инициализировать переменные в классе // при создании запрещено, поэтому мы определяем // метод, реализующий данное действие void Initial(int o,int t){ one=o; two=t; } // метод показывающий переменные класса // на экран void Show(){ cout<<"\n\n"<<one<<"\t"<<two<<"\n\n"; } int two; }; void main(){ // создается объект с типом Test Test obj; //(здесь, в момент создания объекта, сработает конструктор) // показ на экран obj.Show(); // 0 0 // вызывается функция, инициализирующая его свойства obj.Initial(2,5); // показ на экран obj.Show(); // 2 5 // прямая запись в открытую переменную two // с переменной one такая запись невозможна, так // как доступ к ней закрыт obj.two=45; // снова показ на экран obj.Show(); // 2 45 }
C помощью параметров конструктору можно передать любые данные, необходимые для инициализации объектов класса.
Пример. Класс, описывающий точку.
# include <iostream> using namespace std; // описание класса Point class Point { int x, y; // координаты точки, по умолчанию имеют // уровень доступа private public: // конструктор присваивает переменным класса x и y начальные // значения соответственно x0 и y0 Point(int x0, int y0) { x = x0; y = y0; } // функция вывода координат точки на экран void ShowPoint() { cout << "\nx = " << x; cout << "\ny = " << y; } }; void main() { Point A(1,3); // создаем точку А (объект типа Point) // с координатами x = 1, y = 3 (вызывается конструктор Point(1, 3) A.ShowPoint(); // выводим координаты точки А на экран }
Еще кое-что о конструкторах…
Point() { x = 0; y = 0; }
Деструктор (destruct - разрушать) выполняет функцию, противоположную функции конструктора.
Деструктор - это специальная функция класса, которая автоматически вызывается при уничтожении объекта - например, когда объект выходит из области видимости. Деструктор может выполнять любые задачи, в момент удаления объекта. Например, если в конструкторе была динамически выделена память, то деструктор должен освободить эту память перед удалением объкта класса.
Основные особенности при работе с деструктором.
Пример последовательности, в которой вызываются конструкторы и деструкторы.
# include <iostream> using namespace std; // описание класса CreateAndDestroy class CreateAndDestroy { public: CreateAndDestroy(int value) // конструктор { data = value; cout << " Object " << data << " constructor\n"; } ~CreateAndDestroy() // деструктор { cout << " Object " << data << " destructor\n"; } private: int data; }; void main () { CreateAndDestroy one(1); CreateAndDestroy two(2); }
РЕЗУЛЬТАТ РАБОТЫ ПРОГРАММЫ
Object 1 constructor Object 2 constructor Object 2 destructor Object 1 destructor
Вывод к примеру - деструкторы вызываются в последовательности, обратной вызову конструкторов.