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

У меня есть эта struct :

 struct Snapshot { double x; int y; }; 

Я хочу, чтобы x и y были равны 0. По умолчанию они будут 0 или мне нужно делать:

 Snapshot s = {0,0}; 

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

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

 Snapshot s; // receives no initialization Snapshot s = {}; // value initializes all members 

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

 struct Parent { Snapshot s; }; Parent p; // receives no initialization Parent p = {}; // value initializes all members 

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

 struct Snapshot { int x; double y; Snapshot():x(0),y(0) { } // other ctors / functions... }; 

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

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

 Snapshot() : x(0), y(0) { } 

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

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

 int x; // 0 int y = 42; // 42 struct { int a, b; } foo; // 0, 0 void foo() { struct { int a, b; } bar; // undefined static struct { int c, d; } quux; // 0, 0 } 

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

 Snapshot s = {}; 

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

или вот так:

 struct init { template  operator T * () { return new T(); } }; Snapshot* s = init(); 

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

 struct Snapshot s = { .x = 0.0, .y = 0.0 }; 

Так как это POD (по существу, C-структура), в инициализации его не так много вреда:

 Snapshot s; memset(&s, 0, sizeof (s)); 

или аналогичным образом

 Snapshot *sp = new Snapshot; memset(sp, 0, sizeof (*sp)); 

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

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

Переместите элементы pod в базовый class, чтобы сократить список инициализаторов:

 struct foo_pod { int x; int y; int z; }; struct foo : foo_pod { std::string name; foo(std::string name) : foo_pod() , name(name) { } }; int main() { foo f("bar"); printf("%d %d %d %s\n", fx, fy, fz, f.name.c_str()); } 
  • Каков базовый тип enums c ++?
  • Почему VS не определяет альтернативные токены для логических операторов?
  • Visual Studio 2015 Сломанная razor Intellisense
  • Предупреждение - сравнение между подписанными и беззнаковыми целыми выражениями
  • MVC - Передача данных с помощью RedirectToAction ()
  • Как я могу создать поле со списком WPF шириной самого широкого элемента в XAML?
  • Доступ к переменной из другого скрипта C #
  • std :: queue iteration
  • Почему индексирование начинается с нуля в 'C'?
  • Проверить хорошо сформированный XML без try / catch?
  • Как вы проводите тесты NUnit от Jenkins?
  • Interesting Posts

    Получить данные из ввода файла в JQuery

    Понимание диаграмм

    RHEL 6: GNOME: просмотр файла * .desktop в оболочке, отличной от системной по умолчанию

    Разница между разветвителем Ethernet и коммутатором

    Выбор рулетки в генетических алгоритмах

    Наибольшее и наименьшее число в массиве

    Точка в алгоритме многоугольника

    QT4: Прозрачное окно с закругленными углами

    В Windows 10, почему некоторые программы масштабируются на втором мониторе 2.1, но не контролируют 2.2?

    Как использовать paginate () с предложением having (), когда столбец не существует в таблице

    Могу ли я получить аргументы командной строки других процессов из .NET / C #?

    Используйте ноутбук в качестве удаленного дисплея для Linux

    Отключить кеширование в JPA (eclipselink)

    Используя Virtualbox, почему мой гость (Win7) не видит полный размер диска?

    Преобразуйте матрицу в таблицу из трех столбцов («обратный поворот», «разворот», «сгладить», «нормализовать»)

    Давайте будем гением компьютера.