В C++ объект считают полностью инициализированным, когда выполнение вводит тело конструктора.
Вы сказали:
"я хотел знать, почему константа должна быть инициализирована в списке инициализатора конструктора, а не в он - тело?".
то, Что Вы пропускаете, - то, что инициализация происходит в списке инициализации, и , присвоение происходит в теле конструктора. Шаги в логике:
1) объект константы может только быть инициализирован.
2) объект имеет всех своих участников, инициализированных в списке инициализации. Даже если Вы явно не инициализируете их там, компилятор счастливо сделает так для Вас:-)
3) Поэтому помещение 1) и 2) вместе, участнику, который является константой, можно было только когда-либо присваивать значение ей при инициализации, которая происходит во время списка инициализации.
const
и ссылочные переменные должен быть инициализирован на строке, которой они объявляются.
class Something
{
private:
const int m_nValue;
public:
Something()
{
m_nValue = 5;
}
};
произвел бы код, эквивалентный;
const int nValue; // error, const vars must be assigned values immediately
nValue = 5;
Присваивающаяся константа или ссылочные членские значения переменных в теле конструктора не достаточны.
C++ обеспечивает другой способ инициализировать членские переменные, который позволяет инициализировать членские переменные, когда они создаются, а не впоследствии. Это сделано посредством использования списка инициализации.
можно присвоить значения переменным двумя способами: явно и неявно: просмотреть plaincopy к clipboardprint?
int nValue = 5; // explicit assignment
double dValue(4.7); // implicit assignment
Используя список инициализации очень похоже на делание уроки.
Помнят, что членский список инициализации, используемый для инициализации основы и членских объектов данных, находится в определении, не объявлении конструктора.
[еще 1113] на cpp-учебное-руководство и Код Рэнглер .