Ответ 1
Object obj();
не является экземпляром объекта, это объявление функции obj
, которая не принимает аргументов и возвращает экземпляр Object
.
Object obj;
представляет собой default initialization
, то есть экземпляр с неявным конструктором (таким образом, неявный конструктор по умолчанию или пользовательский конструктор не explicit
без параметров), и это выражение вызывает неявные конструкторы членов, отличных от POD Object
и для POD-типов он не инициализирует их (они не будут обнулены). Это верно для членов членов Object
и т.д. Рекурсивно.
Object obj{};
- инициализация списка или инициализация агрегата (если Object
является агрегатом). Те, которые он назвал по-разному, для пустых фигурных скобок, поведение одинаковое: все члены типов POD инициализируются нулями, а не-POD инициализируются по умолчанию.
Object obj = Object();
Теоретически это двухэтапный оператор: 1) создать временный экземпляр Object
; 2), затем постройте obj с помощью оператора copy/move constructor/copy operator/move. Но на практике он будет сконфигурирован по умолчанию с учетом разрешения копирования/перемещения (он включен для всех современных компиляторов по умолчанию, даже если все оптимизации отключены, вы должны явно отключить его). Лучше не используйте этот вариант.
Pre-Вывод
Выбрать
Object obj;
или
Object obj{};
Выберите сначала, если вы хотите быстро инициализировать, не обнуляя его POD-членов.
Выберите второй, если вы хотите быть уверенным, что все его элементы POD будут равны нулю после создания Object
.
Практически, перед первым чтением от своих членов оба варианта имеют одинаковую скорость во время выполнения всех современных ОС.
Итак...
Заключение
Использовать инициализацию значения:
Object obj{};
если вам не нужна производительность в реальном времени в экзотических системах.