2009-03-20 4 views
20

Я понимаю, конструктор копирования вызывается тремя экземплярамиКопировать конструктор в C++ вызывается, когда объект возвращается из функции?

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

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

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

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

+3

В этих случаях не гарантируется, что в этих случаях будет вызываться конструктор копирования, поскольку стандарт C++ позволяет компилятору оптимизировать копирование в определенных случаях - в частности, [оптимизация возвращаемого значения] (http: // en .wikipedia.org/wiki/Return_value_optimization) – rmp251

+0

Ссылка, на которую указывает @ rmp251, явно отвечает на этот вопрос. –

ответ

15

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

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

0

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

+0

, но что, если конструктор копирования принимает ссылку как параметр (глубокая копия), в этом случае он не будет копировать весь объект, не так ли? – Kazoom

+0

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

11

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

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

+0

Я понимаю, что когда возвращаемое значение объекта возвращается, он сначала вызывает конструктор копирования, но конструктор копирования определяется пользователем, он принимает ссылку как параметр ClassA (const ClassA &), в этом случае что произойдет? Что произойдет, если u просто вернет ссылку вместо значения, идущего по логике ура – Kazoom

+0

Если функция объявлена ​​как возвращающая ссылку, возвращающая ссылку на локальную переменную, это большое значение no-no. Вы вернете ссылку на объект, который будет отброшен при возврате функции. Использование этой ссылки, вероятно, вызовет проблему, включая раздавливание. – sharptooth

+0

Да, я понимаю, что, когда конструктор копирования, который принимает ссылку как параметр, вызывается при возврате значения, что произойдет? разве это не крушение? – Kazoom

4

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

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

+2

Я не согласен с вами. Copy construtor вызывается только один раз на возвращаемом объекте, когда присваивается возвращаемый объект другому объекту внешней области, вызывается оператор присваивания, а не конструктор копирования. –

-1

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

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