Выбрать главу

Зачем нужны конструкторы...189

Объект можно проинициализировать на этапе его объявления, как сделал бы программист на С:

    struct Student

    {

        int semesterHours ;

        float gpa ;

    } ;

    void fn( )

    {

        Student s1 = { 0 , 0.0 } ;

        // или

        Student s2 ;

        s2.semesterHours = 0 ;

        s2.gpa = 0.0 ;

        /* ...продолжение функции... */

    }

Этот фрагмент кода не будет работать для настоящего класса С++, поскольку внешнее приложение не имеет доступа к защищённым членам класса. Обойти это ограничение можно, воспользовавшись специальной инициализирующей функцией, например, так:

    class Student

    {

      public :

        void init( )

        {

            semesterHours = 0 ;

            gpa = 0.0 ;

        }

        /* ...прочие открытые члены... */

      protected :

        int semesterHours ;

        float gpa ;

    } ;

    void fn( )

    {

        /* Создание объекта... */ 

        Student s ;

        /* ...и его инициализация */

        s.init( ) ;

        /* ...продолжение функции... */

    }

_________________

189 стр. Глава 16. Создание и удаление объектов

Это решение имеет большой недостаток: класс должен полагаться на то, что приложение обязательно вызовет инициализирующую функцию. Если же эта функция не будет вызвана, в объекте будет содержаться мусор, и последствия этого совершенно непредсказуемы.

Для того чтобы избежать этой неприятности, ответственность за вызов инициализирующей объект функции необходимо переложить с приложения на компилятор. Всякий раз при создании объекта компилятор может вставлять в код специальную инициализирующую функцию — а это и есть конструктор!

Работа с конструкторами...190

Конструктор — это специальная функция-член, которая автоматически вызывается во время создания объекта. Конструктор должен иметь то же имя, что и класс. Таким образом компилятор сможет определить, что именно эта функция-член является конструктором. Конечно, создатели С++ могли сформулировать это правило как угодно, например, так: "Конструктором является функция с именем init( )". Как именно определено правило, не имеет значения; главное — чтобы конструктор мог быть распознан компилятором. Ещё одним свойством конструктора является то, что он не возвращает никакого значения, поскольку вызывается автоматически ( если бы конструктор и возвращал значение, его всё равно некуда было бы записать ).

Конструирование одного объекта...190

Класс с использованием конструктора продемонстрирован в следующем примере.

    //

    /* Constructor — пример вызова конструктора */

    //

    #include <cstdio>

    #include <cstdlib>

    #include <iostream>

    using namespace std ;

    class Student

    {

      public :

        Student( )

        {

            cout << "Конструируем Student" << endl ;

            semesterHours = 0 ;

            gpa = 0.0 ;

        }

        /* ...прочие открытые члены... */

      protected :

        int semesterHours ;

        float gpa ;

    } ;

    int main ( int nNumberofArgs , char* pszArgs[ ] )

    {

        setlocale ( LC_ALL , ".1251" ) ; /* печать кириллицы */