Заметьте, что все три конструктора ( и особенно два последних ) очень похожи. Единственное отличие второго конструктора от третьего заключается в том, что он обнуляет поля semesterHours и gpa , в то время как третий конструктор может присваивать им передаваемые в качестве аргументов значения.
_________________
201 стр. Глава 17. Аргументация конструирования
С++ позволяет в объявлении функции указать значения аргументов по умолчанию, т.е. используемые в том случае, если программист их не указал. Если применить этот метод в третьем конструкторе, то все три конструктора можно объединить в один, как это сделано в представленной ниже программе.
/* ConstructorWDefaults — несколько конструкторов */
/* зачастую могут быть */
/* бъединены в один */
#include
#include
#include
#include
using namespace std ;
const int MAXNAMESIZE = 40 ;
class Student
{
public :
Student( char *pName = "no name" ,
int xfrHours = 0 ,
float xfrGPA = 0.0 )
{
cout << "Конструктор Student( " << pName<< ","
<< xfrHours << "," << xfrGPA << " )" << endl ;
strncpy( name , pName , MAXNAMESIZE ) ;
name[ MAXNAMESIZE - 1 ] = '\0' ;
semesterHours = xfrHours ;
gpa = xfrGPA ;
}
~Student( )
{
cout << "Деструктор Student" << endl ;
}
/* ...прочие открытые члены... */
protected :
char name[ MAXNAMESIZE ] ;
int semesterHours ;
float gpa ;
} ;
int main( int argcs , char* pArgs[ ] )
{
setlocale ( LC_ALL , ".1251" ) ; /* печать кириллицы */
/* Вызов одного и того же конструктора */
Student noName ;
Student freshman( "Marian Haste" ) ;
Student xferStudent( "Pikumup Andropov" , 80 , 2.5 ) ;
/* Пауза для того, чтобы посмотреть на результат работы программы */
system( "PAUSE" ) ; return 0 ;
}

Теперь все три объекта строятся с помощью одного и того же конструктора, а значения по умолчанию используются для аргументов, отсутствующих в объектах freshMan и noName .
_________________
202 стр. Часть 3. Введение в классы

«В ранних версиях С++ вы не смогли бы создать конструктор по умолчанию, предусмотрев значения по умолчанию для всех аргументов. Конструктор по умолчанию должен был быть определён явно. Так что будьте готовы к тому, что некоторые старые версии компиляторов могут потребовать явного определения конструктора по умолчанию.»
[ Помни! ]
►Определение конструкторов по умолчанию...203
Стоит отметить, что в С++ каждый класс должен иметь свой конструктор. Казалось бы, С++ должен генерировать сообщение об ошибке в случае, когда класс не оснащён конструктором, однако этого не происходит. Дело в том, что для обеспечения совместимости с существующим кодом С, который ничего не знает о конструкторах, С++ автоматически создаёт конструктор по умолчанию ( так сказать, умалчиваемый конструктор по умолчанию ), который инициализирует все данные-члены объекта нулями.
Если ваш класс имеет конструктор, С++ не будет автоматически его создавать ( как только С++ убеждается в том, что это не программа на С, он снимает с себя всю ответственность по обеспечению совместимости ).

«Вывод: если вы определили конструктор для вашего класса и при этом хотите, чтобы класс имел конструктор по умолчанию, то должны явно определить такой конструктор сами.»
[ Атас! ]
Приведённый ниже фрагмент демонстрирует сказанное. Этот пример вполне корректен.
class Student
{
/* ...то же, что и раньше, только без конструкторов */
} ;
int main( int argcs , char* pArgs[ ] )
{
Student noName ;
return 0 ;
}
Приведённый далее пример компилятор с негодованием отвергнет.
class Student
{
public :
Student( char *pName ) ;
} ;
int main( int argcs , char* pArgs[ ] )
{
Student noName ;
return 0 ;
}
To, что здесь добавлен конструктор Student ( char* ) , выглядит безобидно, но при этом заставляет С++ отказаться от автоматической генерации конструктора по умолчанию.
_________________
203 стр. Глава 17. Аргументация конструирования
Не попадитесь в ловушку
♦♦♦♦♦
Читать дальше