Страницы

Поиск по вопросам

суббота, 28 декабря 2019 г.

Значение поля bool по умолчанию

#cpp


Нужно ли в конструкторе класса инициализировать нестатическое поле типа bool значением
false или это гарантированно сделано за меня?
    


Ответы

Ответ 1



Нужно. То есть как, там будет непонятное значение. И на всякий случай чтобы знать уже точно что там false. Всегда при объявлении переменно желательно ее инициализировать.

Ответ 2



Правильно это делается так: class foo { bool bar; public: foo():bar(false) { }; }; Инициализация внутри списка инициализации - самый правильный подход к инициализации! @Ivan на самом деле, в случае примитивных типов особой разницы нет. А вот если тип составной - инициализация произойдет дважды - сначала вызовется конструктор по умолчанию, а потом произойдет присваивание. Чтобы не тратить попусту ресурсы системы, следует выработать привычку - все что можно разместить в списке инициализации, должно быть там.

Ответ 3



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

Ответ 4



C++ нужно, иначе будут редкие баги. C# нет, там это автоматически делается.

Ответ 5



Да, необходимо инициализировать поля класса/структуры в его/её конструкторе. Данное поле класса/структуры не будет проинициализировано (т.е. поле примет случайное значение той области стека/кучи (зависит от способа создания экземпляра вашего класса/структуры), которую компилятор выделил под экземпляр вашего класса/структуры). Стоит также заметить, что в случае отсутствия какого-либо конструктора в большинстве компиляторов поля класса/структуры будут проинициализированы значениями 0x00. Явная и неявная инициализация переменных Если при определении переменной не происходит явного присвоения ей какого-либо значения (т.е. не происходит явной инициализации), то компилятор может проинициализировать её сам в соответствии со следующими правилами: переменные со статическим временем существования (глобальные, в пространствах имен и статические) инициализируются нулем автоматические переменные не инициализируются (т.е. имеют случайное значение той области стека, которую компилятор выделил под переменную) динаммические переменные не инициализируются (т.е. имеют случайное значение той области памяти, которая была выделена под объект в куче) Стоит заметить, что в большинстве реализаций в debug-версии под автоматические переменные область стека заполняется значениями 0xCCCCCCCC, а область heap (кучи) заполняется 0xCDCDCDCD, что может позволить при отладке выявлять использование неинициализированных переменных.

Комментариев нет:

Отправить комментарий