Шаг 4.
Конструкторы и доступность компонентов класса

    На этом шаге мы рассмотрим специальные компонентные функции, которые называются конструкторами.

    В определениях классов complex1 и goods есть недостатки, которые легко устранить. Первый из них - отсутствие автоматической инициализации создаваемых объектов. Для каждого вновь создаваемого объекта класса complex1 необходимо вызвать функцию define() либо явным образом с помощью уточненных имен присваивать значения данным объекта, т.е. переменным real и imag. Еще два способа использованы в предыдущей программе. Часть объектов класса goods получила начальные значения при инициализации, которая выполняется по правилам, относящимся к структурам и массивам. Объектам wares[3] и wares[4] значения присвоены с помощью явного вызова компонентной функции Input().

    Для инициализации объектов класса в его определение можно явно включать специальную компонентную функцию, называемую конструктором. Формат определения конструктора в теле класса может быть таким:

    имя_класса (список_формальных_параметров) 
           {   операторы_тела_конструктора   };

    Имя этой компонентной функции по правилам языка C++ должно совпадать с именем класса. Такая функция автоматически вызывается при определении или размещении в памяти с помощью оператора new каждого объекта класса. Основное назначение конструктора - инициализация объектов. Для класса complex1 можно ввести конструктор, эквивалентный функции define(), но отличающийся от нее только названием:

     complex1 (double re = 0.0, double im = 0.0) 
          { real = re; imag = im; }

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

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

     goods(char *new_name, float new_price)
     { 
        name = new_name;   // Наименование товара.
        price = new_price; // Закупочная цена.
     }

    В конструкторе можно было бы изменять и значение заранее инициализированного статического компонента percent, однако в рассматриваемом примере это не делается.

    На следующем шаге мы продолжим разговор о конструкторах.




Предыдущий шаг Содержание Следующий шаг