Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Глава 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; Просмотров: 180; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.013 с.)
Главная | Случайная страница | Обратная связь