C ++: На конструктор копирования по умолчанию влияет присутствие других конструкторов и деструктора? - PullRequest
8 голосов
/ 11 апреля 2011

Как мы знаем , если объявлен какой-либо конструктор (включая конструктор копирования), конструктор по умолчанию (тот, который не принимает аргументов) не создается неявно. Происходит ли то же самое с конструктором копирования по умолчанию (тот, который выполняет поверхностное копирование объекта)? Кроме того, присутствие деструктора влияет на это так или иначе?

Ответы [ 5 ]

9 голосов
/ 11 апреля 2011

12.8 # 4 Копирование объектов класса

Если определение класса не объявляет явно конструктор копирования, оно объявляется неявно

Идеструктор не играет никакой роли

6 голосов
/ 11 апреля 2011

Ответы здесь верны, но не полны.Они верны для C ++ 98 и C ++ 03.В C ++ 11 вы не получите конструктор копирования, если вы объявили конструктор перемещения или оператор присваивания перемещения.Кроме того, если вы объявили оператор присваивания копии или деструктор, неявное создание конструктора копирования не рекомендуется.12.8 [class.copy]:

Если в определении класса явно не объявляется конструктор копирования, не существует объявленного пользователем конструктора перемещения и не существует объявленного пользователем оператора назначения перемещения, копияКонструктор неявно объявляется как дефолтный (8.4.2).Такое неявное объявление не рекомендуется, если у класса есть пользовательский оператор копирования или пользовательский деструктор.

3 голосов
/ 11 апреля 2011

Нет.И обратите внимание, что

MyClass
{
    template <typename T> MyClass(const T&);
};

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

3 голосов
/ 11 апреля 2011

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

1 голос
/ 11 апреля 2011

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

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