Являются ли члены структуры C ++ инициализированы в 0 по умолчанию?
===================================================================

у меня есть это`struct`:

я хочу`x` а также`y` быть 0. Будут ли они по умолчанию 0 или я должен сделать:

Каковы другие способы обнуления структуры?

Они не равны нулю, если вы не инициализируете структуру.

Второй обнулит все элементы, первый оставляет их с неопределенными значениями. Обратите внимание, что это рекурсивно:

Второе сделаю`p.s.{x,y}` нуль. Вы не можете использовать эти агрегатные списки инициализаторов, если у вас есть конструкторы в вашей структуре. Если это так, вам придется добавить правильную инициализацию для этих конструкторов

Инициализирует и x, и y как 0. Обратите внимание, что вы можете использовать`x(), y()` чтобы инициализировать их, не обращая внимания на их тип: это затем инициализирует значение и обычно дает правильное начальное значение (0 для int, 0,0 для double, вызов конструктора по умолчанию для пользовательских типов, которые имеют конструкторы, объявленные пользователем, ...). Это важно, особенно если ваша структура является шаблоном.



В C ++ используйте конструкторы без аргументов. В C вы не можете иметь конструкторов, поэтому используйте либо`memset` или - интересное решение - обозначенные инициализаторы:



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



Я считаю, что правильный ответ заключается в том, что их значения не определены. Часто они инициализируются равными 0 при запуске отладочных версий кода. Обычно это не тот случай, когда запускаются версии выпуска.



В общем нет. Однако структура, объявленная как file-scope или static в функции / будет / будет инициализирована в 0 (как и все другие переменные этих областей):



Так как это POD (по сути, структура C), нет ничего плохого в том, чтобы инициализировать его способом C:

или аналогично

Я бы не пошел так далеко, чтобы использовать`calloc()` в программе на C ++.



Нет, они не равны 0 по умолчанию. Самый простой способ убедиться, что все значения или значение по умолчанию равно 0, это определить конструктор

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



С POD вы также можете написать

Вы не должны использовать memset в C ++, у memset есть недостаток, заключающийся в том, что если в структуре есть не-POD, он уничтожит его.

или вот так: