В C ++, когда вы пишете это:
class A {
public:
A() { ... }
};
Компилятор фактически генерирует это в зависимости от того, что использует ваш код:
class A {
public:
A() { ... }
~A() { ... }
A(const A& other) {...}
A& operator=(const A& other) { ... }
};
Так что теперь вы можете увидеть различные семантикиразличных конструкторов.
A a1; // default constructor
A a2(a1); // copy constructor
a2 = a1; // copy assignment operator
Конструкторы копирования в основном копируют все нестатические данные.Они генерируются, только если результирующий код является допустимым и нормальным: если компилятор видит типы внутри класса, которые он не знает, как копировать (в соответствии с обычными правилами присваивания), тогда конструктор копирования не будет сгенерирован.Это означает, что если тип T не поддерживает конструкторы или если одно из открытых полей класса является, например, const или ссылочным типом, генератор не будет их создавать - и код не будет собираться.Шаблоны расширяются во время сборки, поэтому, если полученный код не будет собран, произойдет сбой.И иногда это происходит громко и очень загадочно.
Если вы определите конструктор (или деструктор) в классе, генератор не сгенерирует конструктор по умолчанию.Это означает, что вы можете переопределить созданные по умолчанию конструкторы.Вы можете сделать их приватными (по умолчанию они общедоступны), вы можете переопределить их, чтобы они ничего не делали (полезно для экономии памяти и предотвращения побочных эффектов) и т. Д.