C ++ Создание объекта из класса двумя различными способами - PullRequest
9 голосов
/ 22 декабря 2010

Я почти уверен, что об этом уже спрашивали, но я не могу найти его с помощью поиска.

Итак, вот так:

Какая разница между:

MyObj myObj;

и

MyObj myObj = MyObj();

Я считаю, что оба достигают одного и того же результата, но один из них лучше использовать, чем другой?Предположим, все, что мне нужно, - это конструктор по умолчанию.

* edit - я слышал, что первый более уместен, так как второй сначала создает объект через конструктор по умолчанию, а затем присваивает myObj.Во-первых, нет операции «назначить», поэтому первая будет «быстрее».Правда?

Ответы [ 3 ]

9 голосов
/ 22 декабря 2010

Да, может быть разница.

В первом случае myObj не инициализируется, если это тип POD, в противном случае оно инициализируется по умолчанию .

Во втором случае myObj является инициализированным копированием из временного инициализированного значения .Временный может (и почти наверняка должен) быть исключен, чтобы создать эффект value-initialization .

Если у MyObj есть конструктор, то конструктор всегда будет вызываться.В первом случае должен быть доступен конструктор по умолчанию, а во втором должны быть доступны и конструктор копирования, и конструктор по умолчанию, хотя может быть вызван только конструктор по умолчанию. значение инициализировано для типов POD, существует разница между значение по умолчанию и значение инициализировано для типов не POD без пользовательских конструкторов.Для этих типов члены POD не инициализируются в инициализация по умолчанию , но инициализируются нулями в инициализация значения родительского класса.

4 голосов
/ 22 декабря 2010

Первый - это объявление, второй - инициализация.

Если MyObj не является POD, то на самом деле нет никакой разницы, за исключением того, что конструктор копирования должен существовать и быть доступным в последнем случае (даже если это не такnamed).

Если MyObj - это POD, то первый не инициализирует его, содержимое переменных-членов MyObj будет не указано.Последний является единственным способом «обнуления» инициализации неагрегированного POD.

0 голосов
/ 21 октября 2013

Без особых объяснений. Первый использует конструктор по умолчанию для инициализации myObj.Второй фактически создает временный экземпляр, а затем использует конструктор копирования для инициализации myObj.(помните, что также создается конструктор копирования по умолчанию, а не просто конструктор по умолчанию)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...