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 << ")n";

                        }

            };

      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)

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

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

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

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

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

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

      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 элементов в каждом.