Объектно-ориентированное программирование на C++

       

Конструкторы и деструкторы


Рассмотрим наш пример с трехмерным вектором. При объявлении класса _3d мы использовали struct{}, а, следовательно, данные и методы были по умолчанию общедоступными. Это, в частности, означает, что следующий пример, вообще говоря, вполне правилен:

_3d vectorA;

double m;

vectorA.x = 17.56;

vectorA.y = 35.12;

vectorA.z = 1.0;

m = vectorA.mod();

Однако по догматам ООП такой стиль программирования должен быть признан ошибочным, так как, по идее, все элементы, описывающие состояния объекта, должны быть скрыты внутри него и доступны лишь только с помощью посылаемых объекту сообщений. Если поменять ранее данное определение класса _3d на следующее:

class _3d

{

 double x, y, z;

public:

 double mod () {return sqrt (x*x + y*y +z*z);}



 double projection (_3d r) {return (x*r.x + y*r.y + z*r.z) / mod();}

 _3d operator + (_3d b);

};

мы получим "идейно грамотное" решение. Но при компиляции предыдущего фрагмента будет диагностирована попытка обратиться к защищенному элементу класса. Это замечательно, поскольку заставит Вас дополнить интерфейс класса методами, позволяющими присвоить значения координатам вектора.

Следующая версия класса может выглядеть примерно так:

class _3d

{

 double x, y, z;

public:

 double mod () {return sqrt (x*x + y*y +z*z);}

 double projection (_3d r) {return (x*r.x + y*r.y + z*r.z) / mod();}

 void set (double newX, double newY, double newZ)

 {

  x = newX; y = newY; z = newZ;

 }

 _3d operator + (_3d b);

};

Метод set() позволяет присвоить некоторые начальные значения координатам вектора (и только этот метод!).

Еще одно замечание: хотя x, y и z теперь относятся к защищенным членам класса, явное обращение этим элементам объекта, переданного в качестве параметра (см. метод projection(...) и оператор "+"), по-прежнему допускается.

Если Вы писали программы, то знаете, что при объявлении переменной, как правило, ее инициализируют. С++ дает нам возможность создать метод, который будет автоматически вызываться для инициализации объекта данного типа при его создании. Такой метод называется конструктором. Конструктор определяет, как будет создаваться новый объект, когда это необходимо, может распределить под него память и инициализировать ее. Он может включать в себя код для распределения памяти, присваивание значений элементам, преобразование из одного типа в другой и многое полезное.


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

Функцией, обратной конструктору, является деструктор. Эта функция обычно вызывается при удалении объекта. Например, если при создании объекта для него динамически выделялась память, то при удалении объекта ее нужно освободить. Локальные объекты удаляются тогда, когда они выходят из области видимости. Глобальные объекты удаляются при завершении программы.

В языке С++ деструкторы имеют имена: "~имя_класса". Как и конструктор, деструктор не возвращает никакое значение, но в отличие от конструктора не может быть вызван явно. Конструктор и деструктор не могут быть описаны в закрытой части класса.

class _3d

{

 double x, y, z;

public:

 _3d();

 ~_3d()

 {

  cout << 'Работа деструктора _3d \n';

 }

 double mod () {return sqrt (x*x + y*y +z*z);}

 double projection (_3d r) {return (x*r.x + y*r.y + z*r.z) / mod();}

 void set (double newX, double newY, double newZ)

 {

  x = newX; y = newY; z = newZ;

 }

 };

_3d::_3d() // конструктор класса _3d

{

 x=y=z=0;

 cout << 'Работа конструктора _3d \n';

}

main()

{

 _3d A; // создается объект A и происходит инициализация его элементов

  // A.x = A.y = A.z = 0;

 A.set (3,4,0); // Теперь A.x = 3.0, A.y = 4.0, A.z = 0.0

cout << A.mod()<<'\n';

}

Результат работы программы:

Работа конструктора _3d

5.0

Работа деструктора _3d


Содержание раздела