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

64
задан jruizaranguren 27 October 2015 в 07:37
поделиться

2 ответа

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

Вы сказали:

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

то, Что Вы пропускаете, - то, что инициализация происходит в списке инициализации, и , присвоение происходит в теле конструктора. Шаги в логике:

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

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

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

96
ответ дан Vladimir 24 November 2019 в 15:55
поделиться

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-учебное-руководство и Код Рэнглер .

9
ответ дан VonC 24 November 2019 в 15:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: