Иногда необходимо запретить конструктор копирования в классе С++, чтобы класс стал "не копируемым". Конечно, operator=
должен быть запрещен одновременно.
До сих пор я видел два способа сделать это. Способ 1 - объявить метод private и не дать ему никакой реализации:
class Class {
//useful stuff, then
private:
Class( const Class& ); //not implemented anywhere
void operator=( const Class& ); //not implemented anywhere
};
Способ 2 - объявить метод private и дать ему "пустую" реализацию:
class Class {
//useful stuff, then
private:
Class( const Class& ) {}
void operator=( const Class& ) {}
};
IMO первый лучше - даже если есть какая-то непредвиденная причина, которая приводит к тому, что конструктор копирования вызывается из одной и той же функции-члена класса, позже будет ошибка компоновщика. Во втором случае этот сценарий останется незамеченным до времени выполнения.
Есть ли серьезные недостатки в первом методе? Какой лучший способ, если он есть и почему?