На этом шаге мы рассмотрим специальные компонентные функции, которые называются конструкторами.
В определениях классов 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, однако в рассматриваемом примере это не делается.
На следующем шаге мы продолжим разговор о конструкторах.