Конструктор копирования в C ++ вызывается, когда объект возвращается из функции? - PullRequest
24 голосов
/ 20 марта 2009

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

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

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

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

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

Ответы [ 5 ]

17 голосов
/ 20 марта 2009

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

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

12 голосов
/ 20 марта 2009

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

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

5 голосов
/ 20 марта 2009

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

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

0 голосов
/ 22 апреля 2013

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

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

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

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