logo
Лекции по С++ глава 4

4.2. Конструкторы производных классов

Обратите внимание: программа с помощью класса CBlock сначала вызывает функции-члены SetCoord и SetColor для установки значений переменных класса, а затем вызывает функцию Draw для рисования блока. Чтобы упростить использование CBlock, необходимо добавить конструктор для установки значений всех переменных при создании экземпляра класса.

CBlock (int L, int T, int R, int B, int Color)

: CRectangle {L, T, R, B)

{

SetColor (Color);

}

Список инициализации членов класса в данном конструкторе содержит вызов конструктора базового класса CRectangle, которому передаются значения, присваиваемые переменным-членам. Список инициализации может использоваться для инициализации как базового класса, так и переменных членов (рассматривался в параграфе «Инициализация переменных-членов в конструкторах» гл. 3). Конструктор класса CBlock содержит вызов функции SetColor, которая устанавливает значение переменной FillColor. Теперь, используя конструктор класса, можно создать объект класса CBlock и задать блок всего двумя операторами.

CBlock Block (25, 25, 100, 100, 5};

Block.Draw ( );

Можно также добавить конструктор по умолчанию, присваивающий нулевые значения всем переменным-членам класса.

CBlock ()

{

FillColor = 0;

}

Так как конструктор по умолчанию явно не инициализирует базовый класс (список инициализации пуст), компилятор автоматически вызывает конструктор по умолчанию базового класса (CRectangle::CRectangle ( )), присваивающий нулевые значения всем переменным, определенным внутри него. Если базовый класс не имеет конструктора по умолчанию, то будет получено сообщение об ошибке.

Конструктор по умолчанию класса CBlock позволяет создавать объекты, в которых все переменные-члены равны нулю, без передачи значений или вызова методов класса.

CBlock Block; // создается объект класса CBlock, у которого всем

// переменным-членам присвоены нулевые значения

В конце следующего параграфа приведен листинг 4.2 – полный текст класса CBlock с двумя новыми конструкторами.

Порядок вызова конструкторов и деструкторов

При создании экземпляра производного класса компилятор вызывает конструкторы в следующем порядке.

  1. Конструктор базового класса.

  2. Конструкторы всех объектов-членов (т.е. тех элементов класса, которые являются объектами классов). Эти конструкторы вызываются в порядке перечисления объектов в определении класса.

  3. Собственный конструктор класса.

Деструкторы, если они определены, вызываются в обратной последовательности.

Таким образом, если код конструктора выполнен, можно быть уверенным в том, что базовый класс и его члены уже инициализированы и их использование допустимо. Аналогично, если выполнен код деструктора, то можно быть уверенным в том, что базовый класс и все объекты-члены еще не уничтожены, и их по-прежнему можно использовать.