Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Глава 18. Аргументация конструирования 189
Стоит отметить, что в C++ каждый класс должен иметь свой конструктор. Казалось бы, C++ должен генерировать сообщение об ошибке в случае, когда класс не оснащен конструктором, однако этого не происходит. Дело в том, что для обеспечения совмести- мости с существующим кодом С, который ничего не знает о конструкторах, C++ авто- матически создает конструктор по умолчанию (так сказать, умалчиваемый конструктор по умолчанию), который инициализирует все данные-члены объекта нулями. Если ваш класс имеет конструктор, C++ не будет автоматически его создавать (как только C++ убеждается в том, что это не программа на С, он снимает с себя всю от- ветственность по обеспечению совместимости). Вывод: если вы определили конструктор для вашего класса и при этом хо- тите, чтобы класс имел конструктор по умолчанию, то должны явно опреде- лить такой конструктор сами.
корректен. class Student { ниже фрагмент демонстрирует сказанное. Этот пример вполне
}; int же, и раньше, только без конструкторов Student return } Поскольку объявлен без аргументов, для создания этого объекта C++ вызы- вает конструктор по умолчанию. Однако в этом примере программист не определил ни- каких конструкторов для класса studen t и C++ сам создает конструктор по умолчанию, который просто инициализирует все данные-члены объекта нулевыми значениями. Приведенный далее пример компилятор с негодованием отвергнет. class Student {
}}; int char* { Student noName; return 0; что здесь добавлен конструктор studen t (char*) , выглядит безобидно, но при этом заставляет C++ отказаться от автоматической генерации конструктора по умол- чанию. Поэтому компиляция данного кода в GNU C++ вызовет сообщение об ошиб- ке (оно может быть различным у разных компиляторов, но смысл его один: у класса не определен конструктор по умолчанию): Error: matching function for call не найдена функция, соответствующая вызову
190 Часть III. "Классическое" программирование Компилятор сообщает, что он не может найти конструктор student : : Student (). Добавив конструктор по умолчанию, можно решить эту проблему: class Student {
int main(int argcs, char* { Student return 0; } Это пример нелогичности, поясняющий, за что программистам на C++ платят большие деньги. членовкласса В предыдущих примерах использовались данные-члены простых типов, такие, как floa t или int . Переменные таких простых типов легко инициализировать, пе- редав необходимое значение конструктору. Но что, если класс содержит данные- члены, которые являются объектами других классов? Рассмотрим приведенный ни- же пример.
<string.h>
int class (
{ value = coat << "Присваиваем студенту идентификатор " << value << } protected: int value;
class Student { = name") { << "Создаем студента " << pName << "\n :;trncpy(name, pName, sizeof (name) ) ; name - 1] = } protected: cha r [40] ; Studentl d id ;
int argcs, char* |
Последнее изменение этой страницы: 2019-04-19; Просмотров: 194; Нарушение авторского права страницы