Подтвердить что ты не робот

Почему элементы const должны быть инициализированы в инициализаторе конструктора, а не в его теле?

Почему классы, объявленные как const, инициализируются в списке инициализаторов конструктора, а не в теле конструктора?

В чем разница между двумя?

4b9b3361

Ответ 1

В С++ объект считается полностью инициализированным, когда выполнение входит в тело конструктора.

Ты сказал:

"Я хотел знать, почему const должен быть intialized в инициализаторе конструктора а не в теле?"

То, что вам не хватает, заключается в том, что инициализация происходит в списке инициализации, а присваивание происходит в теле конструктора. Этапы логики:

1) Объект const может быть инициализирован только.

2) Объект имеет все его элементы, инициализированные в списке инициализации. Даже если вы явно не инициализируете их там, компилятор с радостью сделает это за вас: -)

3) Поэтому, ставя 1) и 2) вместе, член, который является константой, может когда-либо иметь значение, назначенное ему при инициализации, которое происходит во время списка инициализации.

Ответ 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.

Ответ 3

Поскольку постоянные переменные и ссылки должны быть инициализированы во время объявления i.e перед использованием. Но конструкторы присваивают значение переменной, не инициализирующей переменную, поэтому вы должны использовать список инициализации для константы и ссылки