Подтвердить что ты не робот

Какая разница между Object obj = Object() и Object obj()?

Я думаю, что у него много информации об этом, но я не знаю, как это называется. Я не могу понять разницу между следующими двумя строками кода:

Object obj();

и

Object obj = Object();

Не могли бы вы объяснить? Или, по крайней мере, сказать, как назвать это.

4b9b3361

Ответ 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{};

если вам не нужна производительность в реальном времени в экзотических системах.

Ответ 2

Object obj();

объявляет функцию, а не объект! Это пример "Most Vexing Parse".

Object obj = Object();

требует, чтобы Object имел доступный конструктор перемещения или конструктор копирования (хотя компилятор мог бы завершить перемещение/копирование).

Простые способы просто создать объект:

Object obj;
Object obj{};

Ответ 3

Object obj();

Объявляет имена функций obj, которые возвращают Object и не принимают никаких параметров. Обычно это не то, что вы хотите.

Object obj = Object();

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

Обычно, если вы хотите построить без вызова конструктора, вы можете использовать

Object obj;
//or
Object obj{};

Ответ 4

Большая разница.

Первый - это прототип функции для функции, не принимающей аргументов и возвращающей объект.

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

Отпустите круглые скобки в первом случае, чтобы сделать утверждения эквивалентными.