Зачем нужны конструкторы...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. Создание и удаление объектов
Это решение имеет большой недостаток: класс должен полагаться на то, что приложение обязательно вызовет инициализирующую функцию. Если же эта функция не будет вызвана, в объекте будет содержаться мусор, и последствия этого совершенно непредсказуемы.
Для того чтобы избежать этой неприятности, ответственность за вызов инициализирующей объект функции необходимо переложить с приложения на компилятор. Всякий раз при создании объекта компилятор может вставлять в код специальную инициализирующую функцию — а это и есть конструктор!
Работа с конструкторами...190
Конструктор — это специальная функция-член, которая автоматически вызывается во время создания объекта. Конструктор должен иметь то же имя, что и класс. Таким образом компилятор сможет определить, что именно эта функция-член является конструктором. Конечно, создатели С++ могли сформулировать это правило как угодно, например, так: "Конструктором является функция с именем init( )". Как именно определено правило, не имеет значения; главное — чтобы конструктор мог быть распознан компилятором. Ещё одним свойством конструктора является то, что он не возвращает никакого значения, поскольку вызывается автоматически ( если бы конструктор и возвращал значение, его всё равно некуда было бы записать ).
Конструирование одного объекта...190
Класс с использованием конструктора продемонстрирован в следующем примере.
//
/* Constructor — пример вызова конструктора */
//
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std ;
class Student
{
public :
Student( )
{
cout << "Конструируем Student" << endl ;
semesterHours = 0 ;
gpa = 0.0 ;
}
/* ...прочие открытые члены... */
protected :
int semesterHours ;
float gpa ;
} ;
int main ( int nNumberofArgs , char* pszArgs[ ] )
{
setlocale ( LC_ALL , ".1251" ) ; /* печать кириллицы */