►Определение конструкторов по умолчанию...203

We use cookies. Read the Privacy and Cookie Policy

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

Если ваш класс имеет конструктор, С++ не будет автоматически его создавать ( как только С++ убеждается в том, что это не программа на С, он снимает с себя всю ответственность по обеспечению совместимости ).

 

«Вывод: если вы определили конструктор для вашего класса и при этом хотите, чтобы класс имел конструктор по умолчанию, то должны явно определить такой конструктор сами.»

[Атас!]

Приведённый ниже фрагмент демонстрирует сказанное. Этот пример вполне корректен.

    class Student

    {

        /* ...то же, что и раньше, только без конструкторов */

    } ;

    int main( int argcs , char* pArgs[ ] )

    {

        Student noName ;

        return 0 ;

    }

        Приведённый далее пример компилятор с негодованием отвергнет.

    class Student

    {

    public :

        Student( char *pName ) ;

    } ;

    int main( int argcs , char* pArgs[ ] )

    {

        Student noName ;

        return 0 ;

    }

To, что здесь добавлен конструктор Student ( char* ), выглядит безобидно, но при этом заставляет С++ отказаться от автоматической генерации конструктора по умолчанию.

_________________

203 стр. Глава 17. Аргументация конструирования

Не попадитесь в ловушку

♦♦♦♦♦

Ещё раз взгляните на объявление объектов класса student из приведённого выше примера:

    Student noName ;

    Student freshMan( "Smell E. Fish" ) ;

    Student xfer( "Upp R. Classman" , 80 , 2.5 ) ;

Все объекты типа student, за исключением noName, объявлены со скобками, в которых находятся передаваемые классу аргументы. Почему же объект noName объявлен без скобок? С точки зрения приверженцев последовательности и аккуратности, лучше было бы объявлять этот объект так:

        Student noName( ) ;

Конечно, можно сделать и так, но это не приведёт к ожидаемому результату. Вместо объявления объекта noName, создаваемого с помощью конструктора по умолчанию для класса student, будет объявлена функция, возвращающая по значению объект класса student. Мистика! Приведённые ниже два объявления демонстрируют, как похожи объявления объекта и функции в формате С++. ( Я-то считаю, что это можно было сделать и по-другому, но кто будет со мной считаться?.. ) Единственное отличие заключается в том, что при объявлении функции в скобках стоят названия типов, а при объявлении объекта в скобках содержатся объекты.

        Student thisIsAFunc( int ) ;

        Student thisIsAnObject( 10 ) ;

Если скобки пусты, невозможно однозначно сказать, что объявляется — функция или объект. Для обеспечения совместимости с языком С в С++ считается, что объявление с пустыми скобками — это объявление функции ( более надёжной альтернативой было бы требование наличия ключевого слова void при объявлении функции, но тогда нарушалось бы условие совместимости с существующими программами на С... ).

♦♦♦♦♦