C++ Программирование в среде С++ Builder 5

         

Конструктор


Конструктор имеет то же имя, что и класс. Он вызывается компилятором всегда, когда создается новый представитель класса. Если в классе не определен никакой конструктор, компилятор генерирует конструктор по умолчанию (не имеющий параметров).,Относительно конструкторов имеют место такие правила:

  • Для него не объявляется тип возвращаемого значения.
  • Он не может возвращать значений оператором return.
  • Конструктор не наследуется.
    • Конструктор не может быть объявлен как const, volatile, virtual или static.

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

    Можно вызвать конструктор для инициализации уже существующего объекта, если перегрузить глобальную операцию new таким образом, чтобы она принимала дополнительный аргумент — указатель типа void*. Это называют размещающей формой операции; мы о ней уже упоминали в прошлой главе. Такая методика иногда применяется для глобальных представителей класса, если их нужно инициализировать после выполнения каких-то предварительных действий. Вот пример:

    #include <new.h>

    // Операция new, допускающая форму размещения:

    inline void *operator new(size_t, void* p)

    {

    return p;

    }

    class Dummy

    {



    public:

    Dummy() // Конструктор.

    };

    Dummy gblDummy;// Глобальный объект.

    int main ()

    {

    InitSystem(); // Какие-то проверки

    // и инициализации.

    new(&gblDummy) Dummy; // Вызывает конструктор

    // для gblDummy.

    return 0;

    }

    Элементы данных класса часто инициализируют в теле конструктора, присваивая им соответствующие значения. Однако существует альтернативный механизм инициализации. Он использует список инициализации элементов.

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

    Вот простейший пример класса с двумя перегруженными конструкторами, в одном из которых применяется обычный способ инициализации в теле функции, а во втором — список инициализации элементов:

    class Time { int hr, min;

    public:

    Time(int h)

    {

    hr = h; min = 0;

    }

    Time(int h, int m): hr(h), min(m)

    {

    }

    };

    Тело второго конструктора, как видите, пусто.

    Список инициализации является единственным средством присвоения значений элементам данных класса, объявленным как const или как ссылки (а также закрытым элементам базовых классов).



    Содержание раздела