Измените его на:
Default oDefault = Default(); // Version 1
Хотя вы можете использовать:
Default oDefault; // Version 2
Это имеет немного другое значение.
- Версия 1: инициализирует нулями элементы POD (в некоторых ситуациях).
- Версия 2. Вызывает неинициализацию членов POD (в некоторых ситуациях).
В первой версии похоже, что она вызывает конструкцию дополнительной копии, но это не так (в большинстве компиляторов), поскольку дополнительная копия будет исключена компилятором, и произойдет простая нормальная (инициализируемая нулями) конструкция.
Вы должны предпочесть нулевую инициализацию по умолчанию (в целом), как если бы класс (или любой тип членов) не имел определяемого пользователем конструктора (как по умолчанию), тогда разница в том, что инициализация по умолчанию оставляет члены POD неопределенными, а ноль -инициализированные листья POD инициализируются нулями. Теперь вы можете подумать, что в моем классе нет участников, так что это не имеет значения. Но что произойдет, если вы измените класс, вы собираетесь найти все экземпляры и обновить их; Лучше всего использовать первую версию и позволить компилятору делать правильные вещи.
Подробности о том, как сногсшибательно см .:
Причина, по которой ваша первоначальная версия не сработала, заключается в том, что она на самом деле является предварительным объявлением функции. Это вызвано сложным синтаксисом C ++ и одним из правил, которые вам нужно запомнить. Вы можете посмотреть на это как на «Самый мексиканский анализ».