2014-10-13 3 views
2

Если я хочу, чтобы запретить строительство копировать/назначение, то есть:Публичный удаленный или закрытый по умолчанию ctor/assign/copy ctor?

class foo 
{ 
public: 
    foo(const foo&) = delete; 
    foo& operator = (const foo&) = delete; 
}; 

То же, что:

class foo 
{ 
private: 
    foo(const foo&) = default; 
    foo& operator = (const foo&) = default; 
}; 

Какой это правильный путь, и почему?

+0

в случае последнего 'Foo' является разрешено копировать себя –

+0

в то же самое относится к классам/методам друзей, все они имеют доступ также –

ответ

4

Правильный путь - это первое решение: конструктор копирования и операторы присваивания не определены, поэтому любая попытка их использования не будет компилироваться.

class foo 
{ 
public: 
    foo(const foo&) = delete; 
    foo& operator = (const foo&) = delete; 
}; 

Второй объявляет и определение неявно сгенерированные формы, как private:

  • Объект типа foo разрешается копировать себя.
  • Любой друг класс или метод также разрешен копируйте foo

Так копию строительства/назначения является еще возможно.

Вы можете также использовать boost::noncopyable в качестве базового класса, он делает именно то, что с C++ 11 (см исходный код here)

+0

Да, даже с помощью delete thingy, чтобы отключить некоторые функции-члены, добавленные в C++ 11, я по-прежнему предпочитаю boost :: noncopyable, поскольку он делает очевидным очевидность с простым взглядом а также занимает гораздо меньше текста. – antred

+0

On boost :: noncopyable vs delete: http://stackoverflow.com/a/7841332/576911 –

Смежные вопросы