Почему члены const должны быть инициализированы в инициализаторе конструктора, а не в его теле? - PullRequest
63 голосов
/ 10 декабря 2008

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

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

Ответы [ 3 ]

95 голосов
/ 10 декабря 2008

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

Вы сказали:

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

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

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

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

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

9 голосов
/ 10 декабря 2008

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 ++ предоставляет другой способ инициализации переменных-членов, который позволяет инициализировать переменные-члены при их создании, а не после. Это делается с помощью списка инициализации.

Вы можете присваивать значения переменным двумя способами: явным и неявным: просмотреть обычную копию в буфер обмена?

int nValue = 5; // explicit assignment  
double dValue(4.7); // implicit assignment  

Использование списка инициализации очень похоже на выполнение неявных присвоений.

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

Подробнее о cpp-туториале и Code Wrangler .

0 голосов
/ 12 августа 2016

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

...