Если вы определите (или только объявите) его самостоятельно, компилятор не определит его для вас.
struct A
{
A (); /*declaration is enough to prevent the compiler from
generating default constructor!*/
};
Хотя объявления достаточно, чтобы компилятор не генерировал конструктор по умолчанию, его необходимо определить , если ваш код требует конструктор по умолчанию, в противном случае вы получите ошибку компоновщика.
В C ++ 11 (новый стандарт ISO) вы можете отключить конструкторы, конструктор копирования и назначение копирования как:
struct A
{
A(const A&) = delete //disable copy-constructor
A& operator=(const A&) = delete; //disable copy-assignment
};
Теперь интересная часть
Вы также можете выборочно отключить конструктор (ы) для выбранных типов, что делает delete
более интересным. Учтите это,
struct A
{
A (int) {}
};
Объект этого класса может быть создан не только с аргументом int
, но и любым типом, который неявно преобразуется в int
. Например,
A a1(10); //ok
A a2('x'); //ok - char can convert to int implicitly
B b;
A a3(b); //ok - assume b provides user-defined conversion to int
Теперь предположим, что по какой-то причине я не хочу, чтобы пользователи класса A
создавали объекты с char
или class B
, которые, к счастью или к сожалению, могут неявно преобразовывать в int
, затем вы можете отключить их как:
struct A
{
A(int) {}
A(char) = delete; //disable
A(const B&) = delete; //disable
};
Теперь вот и вы:
A a1(10); //ok
A a2('x'); //error
B b;
A a3(b); //error - assume (even if) b provides user-defined conversion to int
Онлайн-демонстрация: http://ideone.com/ZVyK7
Сообщения об ошибках очень четкие:
prog.cpp: 9: 5: ошибка: удалена функция 'A :: A (символ)'
prog.cpp: 10: 5: ошибка: удалена функция 'A :: A (const B &)'