C++: влияет ли конструктор копирования по умолчанию на наличие других конструкторов и деструкторов?

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

5 ответов


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

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


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

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

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


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


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

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

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


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