Зачем нужны конструкторы...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. Создание и удаление объектов
Это решение имеет большой недостаток: класс должен полагаться на то, что приложение обязательно вызовет инициализирующую функцию. Если же эта функция не будет вызвана, в объекте будет содержаться мусор, и последствия этого совершенно непредсказуемы.
Для того чтобы избежать этой неприятности, ответственность за вызов инициализирующей объект функции необходимо переложить с приложения на компилятор. Всякий раз при создании объекта компилятор может вставлять в код специальную инициализирующую функцию — а это и есть конструктор!
Больше книг — больше знаний!
Заберите 20% скидку на все книги Литрес с нашим промокодом
ПОЛУЧИТЬ СКИДКУ