Выполнение конструктора выполняется в два этапа:
Фаза инициализации
Фаза выполнения тела, которая состоит из всехзаявления в теле конструктора.Обратите внимание, что члены данных типа класса всегда инициализируются на этапе инициализации, независимо от того, инициализирован ли член явно в списке инициализатора конструктора.Инициализация происходит перед выполнением любого оператора в теле конструктора.
Рассмотрим способ инициализации экземпляра ученика класса конструктором -
Student(string &fn, string &ln, int i, int y = Freshman)
: first_name(fn)
, last_name(ln)
, id(i)
, year(y)
{}
Это еще один, но «неэффективный» и «не элегантный» способ сделать то же самое -
Student(string &fn, string &ln, int i, int y = Freshman)
{
first_name = fn;
last_name = ln;
id = i;
year = y;
}
Этот конструктор в новом коде (код выше) назначаетученики класса ученика.Он явно не инициализирует их.Независимо от того, существует ли явный инициализатор или нет, члены first_name и last_name инициализируются еще до выполнения конструктора.Этот конструктор неявно использует строковый конструктор по умолчанию для инициализации членов first_name и last_name.Когда выполняется тело конструктора, члены first_name и last_name уже имеют значения.Эти значения перезаписываются присваиванием внутри тела конструктора.
Таким образом, это означает, что к моменту, когда выполнение достигает открывающей скобки конструктора, это условие -
- 'first_name', которое является строкой , инициализируется вызовом строкового конструктора по умолчанию (тот, который компилятор ' делает ').
- 'last_name', которое является строкой , инициализируется вызовом строкового конструктора по умолчанию (тот, который компилятор ' создает ').
- 'id',это целое число равно неинициализировано .
- 'год', которое является целое число равно неинициализировано .
И теперь ясно, что присваивания выполняются для каждой из четырех переменных в теле конструктора.
Это мойпонимание этой вещи правильно?Я почему-то чувствую, что мне чего-то не хватает.
Кроме того, при использовании списков инициализации используются конструкторы по умолчанию (тот, который компилятор делает для нас ), вызывается и передается с нашими параметрами(в случае string ) и инициализация выполняется как в "int id = i;" в случае id (i) ??
PS: большинство изцитаты из этой ссылки -
http://www.bogotobogo.com/cplusplus/constructor.php