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

Копировать конструктор в С++ вызывается, когда объект возвращается из функции?

Я понимаю, что конструктор копирования вызывается в трех экземплярах

  • При создании экземпляра одного объекта и его инициализации со значениями из другого объекта.
  • При передаче объекта по значению.

3. Когда объект возвращается из функции по значению.

У меня вопрос с №3 если конструктор копирования вызывается, когда возвращается значение объекта, не следует ли создавать проблемы, если объект объявлен локально в функции.

i означает, что конструктор копирования является глубокой копией и принимает ссылку на объект как параметр

4b9b3361

Ответ 1

Он вызвал точно, чтобы избежать проблем. Новый объект, служащий в качестве результата, инициализируется из локально определенного объекта, тогда локально определенный объект уничтожается.

В случае полноразмерного пользовательского конструктора все равно. Первое хранилище выделяется для объекта, который будет служить результатом, затем вызывается конструктор копирования. Он использует переданную ссылку для доступа к локально определенному объекту и копирует то, что необходимо для нового объекта.

Ответ 2

Копирование выполняется до выключения вызываемой функции и копирует существующую локальную переменную в возвращаемое значение.

Вызываемая функция имеет доступ к памяти, которую будет занимать возвращаемое значение, даже несмотря на то, что эта память не находится в "объеме" при копировании, она все еще доступна.

Ответ 3

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

Однако это не должно быть! Компилятор может оптимизировать обе структуры копирования.

Ответ 4

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

Ответ 5

Существует три общих случая, когда вызывается конструктор копирования:

  • При создании экземпляра одного объекта и его инициализации со значениями из другого объекта (одного и того же типа).
  • При передаче объекта по значению.
  • Когда объект возвращается из функции по значению.