cout << "Деструктор id " << value << endl ;
}
protected :
int value ;
} ;
class Student
{
public :
Student( char *pName = "no name" , int ssId = 0 )
: id( ssId )
{
cout << "Конструктор Student( " << pName
<< " )" << endl ;
strncpy( name , pName , MAXNAMESIZE ) ;
name[ MAXNAMESIZE - 1 ] - '\0' ;
}
protected :
char name[ 40 ] ;
StudentId id ;
} ;
int main( int argcs , char* pArgs[ ] )
{
setlocale ( LC_ALL , ".1251" ) ; /* печать кириллицы */
Student s( "Chester" , 1234 ) ;
cout << "Сообщение из функции main" << endl ;
/* Пауза для того, чтобы посмотреть на результат работы программы */
system( "PAUSE" ) ; return 0 ;
}
_________________
207 стр. Глава 17. Аргументация конструирования
Обратите особое внимание на первую строку конструктора. В этой строке есть кое-что, с чем вы до этого не встречались. Следующая за двоеточием команда вызывает конструкторы членов данного класса. Компилятор С++ прочтёт эту строку так: "Вызвать конструктор для члена id с аргументом ssId. Все остальные данные-члены, не вызванные явно, строить с использованием конструктора по умолчанию".
Результат работы этой программы свидетельствует, что всё получилось так, как мы и хотели.
Присвоение id 1234
Конструктор Student( Chester )
Сообщение из функции main
Press any key to continue...
Деструктор id 1234
Конструкторы константных членов...208
Ещё одна проблема возникает при инициализации членов, объявленных как const. Вспомним, что переменная, объявленная как const, инициализируется при объявлении и после этого не может быть изменена. Каким же образом конструктор может присвоить значение константному члену? Проблема решается путём использования синтаксиса с двоеточием:
class Mammal
{
public :
Mammal( int nof ) : numberOfFeet( nof )
{ }
protected :
const int numberOfFeet ;
} ;
Объект класса Mammal ( млекопитающее ) имеет постоянное количество ног ( ампутации не рассматриваются ). Таким образом, это количество следует объявить как const. Значение данному члену присваивается при создании объекта, и после этого не может быть изменено.
«Программисты часто используют синтаксис с двоеточием для инициализации не только константных, но и других членов-данных. Это не обязательно, но часто используется на практике.»
[Советы]
►Управление последовательностью конструирования...208
При наличии нескольких объектов, в которых определены конструкторы, программист обычно не заботится о том, в каком порядке будут конструироваться эти объекты. Однако, если один или несколько конструкторов имеют побочное действие, различная последовательность конструирования может привести к разным результатам.
_________________
208 стр. Часть 3. Введение в классы
Порядок создания объектов подчиняется перечисленным ниже правилам.
■■■
■ Локальные и статические объекты создаются в том порядке, в котором они объявлены в программе.
■ Статические объекты создаются только один раз.
■ Все глобальные объекты создаются до вызова функции main( ).
■ Нет какого-либо определённого порядка создания глобальных объектов.
■ Члены создаются в том порядке, в котором они объявлены внутри класса.
■ Деструкторы вызываются в порядке, обратном порядку вызова конструкторов.
■■■