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( )
. ■ Нет какого-либо определённого порядка создания глобальных объектов.
■ Члены создаются в том порядке, в котором они объявлены внутри класса.
■ Деструкторы вызываются в порядке, обратном порядку вызова конструкторов.
■■■