Объектно-ориентированное программирование - Учебное пособие (А.А. Хусаинов)

2.4. конструкторы

 

Для заполнения полей объекта при его инициализации мы вынуждены определять функцию  init(). Составные функции не позволяют устанавливать значения констант и переменных ссылочного типа, и необходимость вызова этих функций усложняет программирование и делает программу громоздкой. Для заполнения полей объекта при его создании и для освобождения полей при его удалении в Си++ предусмотрено специальное средство, которое состоит из составных функций, называемых конструктором и деструктором.

Составная функция класса, вызываемая при создании объекта, называется конструктором. Поскольку объект создается при его появлении в области видимости и с помощью оператора new, то в этих случаях будет вызываться конструктор.

 

Основные свойства конструктора

Класс может иметь несколько конструкторов. Имя каждого конструктора совпадает с именем класса, для которого этот конструктор определен. Конструкторы могут быть перегружены и иметь параметры по умолчанию.

Конструктор не имеет возвращаемого значения.

Конструктор может быть объявлен и в закрытой, и в защищенной, и в открытой части класса. Если конструктор объявлен в закрытой части, то объекты этого класса могут создаваться только дружественными функциями, а если в защищенной – дружественными функциями производного класса.

Конструктор может быть определен вне тела класса.

 

Пример. Определим класс двумерного вектора. Будем инициализировать его с помощью полярных координат:

 

   #include <iostream.h>

   #include <math.h>

   #include <conio.h>

 

   class Vector

               {

                           double x, y;

               public:

                           Vector( double rho, double phi);

 

                           void show()

                                       {

                                       cout << "Вектор = ("<< x << ", " << y << ") ";

                                       }

               };

 

   Vector::Vector(double rho, double phi = 0)

               {

               x = rho*cos(phi);

               y = rho*sin(phi);

               }

 

   void main()

               {

               clrscr();

 

               Vector v(1), w(-1, 0.5);

               v.show(); w.show();

 

               getch();

               }

 

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

 

   Вектор = (1, 0)

   Вектор = (-0.877583, -0.479426)

 

Обращение к конструктору осуществляется одним из трех способов:

имя объект(параметры);

имя объект = имя(параметры);

имя объект = параметр;

где имя обозначает имя класса. Второй способ называется явным, третий – сокращенным.

Пример. Определим класс, объектом которого является стек заданного размера. Продемонстрируем способы вызова конструктора:

 

   class IntStack

               {

                           int *v, size, top;

               public:

                           IntStack(int size);

               };

 

   IntStack::IntStack(int size)

               {

               v = new int[IntStack::size = size];

               top = size;

               }

 

   void main()

               {

               IntStack s1(1000);

               IntStack s2 = IntStack(1000); // явный

               IntStack s3 = 1000;           // сокращенный

               }

 

В данном примере будут определены 3 стека, по 1000 элементов в каждом.