Копировать конструктор в С++ вызывается, когда объект возвращается из функции?
Я понимаю, что конструктор копирования вызывается в трех экземплярах
- При создании экземпляра одного объекта и его инициализации со значениями из другого объекта.
- При передаче объекта по значению.
3. Когда объект возвращается из функции по значению.
У меня вопрос с №3
если конструктор копирования вызывается, когда возвращается значение объекта, не следует ли создавать проблемы, если объект объявлен локально в функции.
i означает, что конструктор копирования является глубокой копией и принимает ссылку на объект как параметр
Ответы
Ответ 1
Он вызвал точно, чтобы избежать проблем. Новый объект, служащий в качестве результата, инициализируется из локально определенного объекта, тогда локально определенный объект уничтожается.
В случае полноразмерного пользовательского конструктора все равно. Первое хранилище выделяется для объекта, который будет служить результатом, затем вызывается конструктор копирования. Он использует переданную ссылку для доступа к локально определенному объекту и копирует то, что необходимо для нового объекта.
Ответ 2
Копирование выполняется до выключения вызываемой функции и копирует существующую локальную переменную в возвращаемое значение.
Вызываемая функция имеет доступ к памяти, которую будет занимать возвращаемое значение, даже несмотря на то, что эта память не находится в "объеме" при копировании, она все еще доступна.
Ответ 3
В соответствии с ответом на мой вопрос конструктор копирования можно вызвать даже дважды: один раз, чтобы скопировать локальный объект на объект возврата, и один раз скопируйте возвращаемый объект на переменную, которой он был назначен.
Однако это не должно быть! Компилятор может оптимизировать обе структуры копирования.
Ответ 4
Нет, он вызывает это, прежде чем локальные жители будут уничтожены. Вы можете протестировать это с помощью объекта, который регистрирует разрушение и копию конструкции, или просматривая сгенерированный код сборки.
Ответ 5
Существует три общих случая, когда вызывается конструктор копирования:
- При создании экземпляра одного объекта и его инициализации со значениями из другого объекта (одного и того же типа).
- При передаче объекта по значению.
- Когда объект возвращается из функции по значению.