Почему классы, объявленные как const
, инициализируются в списке инициализаторов конструктора, а не в теле конструктора?
В чем разница между двумя?
Почему классы, объявленные как const
, инициализируются в списке инициализаторов конструктора, а не в теле конструктора?
В чем разница между двумя?
В С++ объект считается полностью инициализированным, когда выполнение входит в тело конструктора.
Ты сказал:
"Я хотел знать, почему const должен быть intialized в инициализаторе конструктора а не в теле?"
То, что вам не хватает, заключается в том, что инициализация происходит в списке инициализации, а присваивание происходит в теле конструктора. Этапы логики:
1) Объект const может быть инициализирован только.
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;
Присвоение значений переменных const или ссылочных элементов в теле конструктора недостаточно.
С++ предоставляет другой способ инициализации переменных-членов, который позволяет инициализировать переменные-члены при их создании, а не потом. Это делается с помощью списка инициализации.
Вы можете присвоить значения переменным двумя способами: явно и неявно: просмотреть обычную копию в clipboardprint?
int nValue = 5; // explicit assignment
double dValue(4.7); // implicit assignment
Использование списка инициализации очень похоже на выполнение неявных назначений.
Помните, что список инициализации члена, используемый для инициализации базовых и объектных объектов данных, находится в определении, а не в объявлении конструктора.
Подробнее о cpp-tutorial и Code Wrangler.
Поскольку постоянные переменные и ссылки должны быть инициализированы во время объявления i.e перед использованием. Но конструкторы присваивают значение переменной, не инициализирующей переменную, поэтому вы должны использовать список инициализации для константы и ссылки