Ответ 1
Во-первых, давайте немного уточним наш словарный запас. Конструктор по умолчанию - это конструктор, который можно вызывать без каких-либо аргументов. Конструктор копирования - это конструктор, который можно вызывать с одним аргументом того же типа. Учитывая это, "конструктор копирования по умолчанию" будет конструктором с сигнатурой, например:
class MyClass
{
public:
static MyClass ourDefaultInstance;
// default copy constructor...
MyClass( MyClass const& other = ourDefaultInstance );
};
Почему-то я не думаю, что ты это имел в виду. Я думаю, что вы спрашиваете о неявно объявленном или неявно определенном конструкторе копирования; конструктор копирования, чье объявление или определение неявно предоставлено компилятором. Компилятор всегда будет предоставлять объявление, если вы не предоставите объявление чего-либо, что можно считать конструктором копирования. Предоставление других конструкторов не помешает компилятору неявно объявить конструктор копирования.
Это отличается от конструктора по умолчанию - любой пользовательский конструктор будет препятствовать тому, чтобы компилятор неявно объявлял конструктор по умолчанию. Это означает, что если у вас есть пользовательский конструктор копирования, компилятор не будет неявно объявлять конструктор по умолчанию.
Вторым важным моментом является то, что вы не вызываете конструкторы. Компилятор вызывает их в определенных четко определенных контекстах: определение переменных и преобразование типов, в основном. Компилятор может вызывать только те конструкторы, которые объявлены (включая те, которые объявлены неявно). Таким образом, если у вас есть определенный пользователем конструктор (копировать или иным образом), и вы не определяете конструктор по умолчанию, компилятор не может вызвать конструктор, кроме случаев, когда у него есть аргументы для вызова.
Подводя итог, я думаю, что ваши вопросы таковы: компилятор предоставит неявный конструктор копирования, даже если у класса есть другие определяемые пользователем конструкторы, при условии, что ни один из этих конструкторов не может считаться конструктором копирования. И если вы предоставите пользовательский конструктор копирования, компилятор не предоставит неявно объявленный конструктор копирования по умолчанию.