У структур есть конструктор по умолчанию, при тех же обстоятельствах, что и классы.
Кстати, структура не является «классом со всем общественным». Это класс с public как спецификатор доступа по умолчанию. У структур могут быть частные члены, но ваш обозреватель кода может ударить вас, если они это сделают.
Соответствующая проблема не является структурой по сравнению с классом, это POD vs. non-POD.
Помните, как член «int» неинициализирован, если вы не указали ему значение в списке инициализаторов или не задали значение в конструкторе? Ну, то же самое относится ко всем типам POD. Конструктор по умолчанию для структуры POD (или класса POD, если на то пошло) не имеет ничего общего. Таким образом, хотя он номинально существует, компилятор не должен генерировать и называть его.
Это означает, что конструктор по умолчанию для любого типа, который вы могли бы определить на C, не должен вводить служебные данные во время выполнения при использовании на C++. На практике я слышу слухи, что не все компиляторы C++ применяют достаточную оптимизацию, чтобы гарантировать, что весь код всегда испускает двоичный файл так хорошо, как это было бы сделано, если бы скомпилировано как C. Но я не знаю, является ли это когда-либо одной из проблем, вызывающих проблемы - я бы предположил, что это обычно одинаково.
Таким образом, учитывая POD-структуру:
struct sPOD {
int foo;
float bar;
char baz[23];
};
Следующая, вероятно не испускают никакого кода в C++ (кроме, возможно, перемещая указатель стека, в зависимости от того, насколько компилятор свертывает автоматические переменные вместе), так же, как в C:
sPOD s1;
Действительно, это не для меня на gcc.
Я думал, что в отсутствие явного конструктора C++ создал неявный, который в принципе строил все члены кусочно. – 2008-10-30 12:54:39
Это так, но если структура содержит только POD (который обычно называется тривиальным конструктором). – 2008-10-30 13:29:03
Будьте осторожны при использовании оператора «new» для создания экземпляров структур. В зависимости от вашего компилятора (например, MSVC), если ваша структура содержит типы классов, их конструкторы по умолчанию не всегда будут вызываться. Проблема в том, что компиляторы не всегда инициализируются как инициализация. – kgriffs 2008-12-31 16:37:27