Этот вопрос уже имеет ответ здесь:
Это - просто быстрый вопрос понять правильно, что происходит, когда Вы создаете класс с конструктором как это:
class A
{
public:
A() {}
};
Я знаю, что никакой конструктор по умолчанию не сгенерирован, так как это уже определяется, но копия, и конструкторы присвоения сгенерированы компилятором, или другими словами я должен объявить частного конструктора копии и частный оператор присваивания для предотвращения этого?
class A
{
private:
// needed to prevent automatic generation?
A( const A& );
A& operator=( const A& );
public:
A() {}
};
Да. Конструктор копирования, оператор присваивания и деструктор всегда создаются независимо от других конструкторов и операторов.
Если вы хотите отключить один, то то, что у вас есть, идеально. Это тоже довольно распространено.
Да, конструктор копирования и операторы присваивания копии по-прежнему создаются, даже если вы объявляете свой собственный конструктор по умолчанию.
Их создание подавляется только в том случае, если вы объявляете собственный конструктор копирования или оператор присваивания копии в определении класса соответственно.
Обратите внимание, что возможно иметь как собственный конструктор копирования, так и предоставленный компилятором:
struct A {
A() { }
A(A const&, int foo);
}; // compiler declares a copy constructor now
// make the second parameter have a default argument
// now this constructor is a copy constructor too.
inline A::A(A const&, int foo = 0) {
}
int main() {
A a;
A b = a; // ambiguity between compiler's one and our custom one!
}
Стандарт, однако, позволяет компиляторам принимать этот код, но эффект аналогичен неопределенному поведению: Программа плохо работает. сформирован, но для этой программы не требуется никаких предупреждений / ошибок. (ранние версии GCC не отвергают этот код, последние отвергают его).
Если вы хотите запретить копирование и присваивание, то лучше наследоваться от класса, который имеет приватный конструктор копирования и оператор присваивания (boost::noncopyable
- готовый).
1) Меньше повторяющегося набора текста.
2) Самодокументирование (надеюсь).
3) Более сильные проверки того, что эти операции не могут быть вызваны (сам класс и его друзья тоже не могут создавать копии - это приведет к ошибке компилятора, а не компоновщика).
4) Не будет скрывать конструктор по умолчанию :)
#include <boost/noncopyable.hpp>
class X : boost::noncopyable
{
};
int main()
{
X a, b; //has default constructor
//X c(a); //but can't be copied
//a = b; //or assigned
}