05.09.2016 Views

Стефан Р. - С++ Для чайников

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Определение fcofiaitftifkJH0fto6<br />

no умолчанию<br />

Стоит отметить, что в C++ каждый класс должен иметь свой конструктор. Казалось<br />

бы, C++ должен генерировать сообщение об ошибке в случае, когда класс не оснащен<br />

конструктором, однако этого не происходит. Дело в том, что для обеспечения совместимости<br />

с существующим кодом С, который ничего не знает о конструкторах, C++ автоматически<br />

создает конструктор по умолчанию (так сказать, умалчиваемый конструктор<br />

по умолчанию), который инициализирует все данные-члены объекта нулями.<br />

Если ваш класс имеет конструктор, C++ не будет автоматически его создавать (как<br />

только C++ убеждается в том, что это не программа на С, он снимает с себя всю ответственность<br />

по обеспечению совместимости).<br />

Вывод: если вы определили конструктор для вашего класса и при этом хотите,<br />

чтобы класс имел конструктор по умолчанию, то должны явно определить<br />

такой конструктор сами.<br />

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

корректен.<br />

class Student<br />

{<br />

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

};<br />

int main(int arges, char* pArgs[])<br />

{<br />

Student noName;<br />

return 0;<br />

}<br />

Поскольку noName объявлен без аргументов, для создания этого объекта C++ вызывает<br />

конструктор по умолчанию. Однако в этом примере программист не определил никаких<br />

конструкторов для класса student и C++ сам создает конструктор по умолчанию,<br />

который просто инициализирует все данные-члены объекта нулевыми значениями.<br />

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

class Student<br />

{<br />

public:<br />

Student(char *pName);<br />

}};<br />

int main(int arges, char* pArgs<br />

{<br />

Student noName;<br />

return 0;<br />

To, что здесь добавлен конструктор student (char*), выглядит безобидно, но при<br />

этом заставляет C++ отказаться от автоматической генерации конструктора по умолчанию.<br />

Поэтому компиляция данного кода в GNU C++ вызовет сообщение об ошибке<br />

(оно может быть различным у разных компиляторов, но смысл его один: у класса<br />

не определен конструктор по умолчанию):<br />

Error: no matching function for call Student::Studentf)<br />

(Ошибка: не найдена функция, соответствующая<br />

вызову Student::Student())<br />

190 Часть III. "Классическое" программирование

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!