Конструктор копии по умолчанию

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

Если это возможно, предположим, что мы явно определяем конструктор копирования для класса, теперь можно ли вызывать (неявный) конструктор по умолчанию?

Ответ 1

Во-первых, давайте немного уточним наш словарный запас. Конструктор по умолчанию - это конструктор, который можно вызывать без каких-либо аргументов. Конструктор копирования - это конструктор, который можно вызывать с одним аргументом того же типа. Учитывая это, "конструктор копирования по умолчанию" будет конструктором с сигнатурой, например:

class MyClass
{
public:
    static MyClass ourDefaultInstance;
    //  default copy constructor...
    MyClass( MyClass const& other = ourDefaultInstance );
};

Почему-то я не думаю, что ты это имел в виду. Я думаю, что вы спрашиваете о неявно объявленном или неявно определенном конструкторе копирования; конструктор копирования, чье объявление или определение неявно предоставлено компилятором. Компилятор всегда будет предоставлять объявление, если вы не предоставите объявление чего-либо, что можно считать конструктором копирования. Предоставление других конструкторов не помешает компилятору неявно объявить конструктор копирования.

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

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

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

Ответ 2

http://www.cplusplus.com/articles/y8hv0pDG/

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

Ответ 3

Нет такой вещи, как конструктор копии по умолчанию. Есть конструкторы по умолчанию и конструкторы копирования, и они разные вещи.

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