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

голоса
60

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

Какая разница между двумя?

Задан 10/12/2008 в 07:35
источник пользователем
На других языках...                            


3 ответов

голоса
92

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

Ты сказал:

«Я хотел бы знать, почему Const должен быть intialized в списке инициализации конструкторы, а не в этом теле?».

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

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

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

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

Ответил 10/12/2008 в 08:01
источник пользователем

голоса
9

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  

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

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

Подробнее о СРР-учебник и Code Wrangler .

Ответил 10/12/2008 в 07:57
источник пользователем

голоса
-2

Поскольку постоянные переменные и ссылки должны быть инициализированы во время декларации, т.е. перед использованием. Но Конструкторы присвоят значение Названия переменного не initailize переменного поэтому вы должны использовать initailizier список для постоянных и ссылок

Ответил 12/08/2016 в 09:05
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more