Что означают ключевые слова default и delete в конструкторах и методах?
Создаю собственный класс unique ptr, и при поиске информации заметил, что нужно писать некоторые методы и конструкторы вот так:
UniquePtr() = default;
UniquePtr &operator=(const UniquePtr &object) = delete;
Как в данном случае работают ключевые слова default и delete?
Ответы (1 шт):
Последний ваш комментарий натолкнул меня ответить. Нет, не для того, чтобы лишь бы следовать каким то правилам, а для того, чтобы явно иметь то, что вы хотите иметь...
Бывают ситуации, когда явно нужно указать компилятору, что он должен генерировать конструктор(или другую функцию_член) по умолчанию. Вот простой пример:
class UniquePtr {
int* p{};
size_t sz{};
public:
UniquePtr(const int* array, const size_t size)
: p(array), sz(size) {}
//...
};
Мы имеем конструктор с двумя аргументами, и так как мы сами написали конструктор, компилятор самостоятельно не будет генерировать другой конструктор(не имеет право), поэтому мы не сможем создать объект типа UniquePtr без аргументов для конструирования. Но если добавить UniquePtr() = default;, то можно свободно создать UniquePtr ptr
Почему это удобнее и безопаснее, чем старый способ присвоения аргументам каким то значениям по умолчанию(иногда это невозможно(например для константных аргументов) или слишком длинно и является источником путаницы), является другой темой.
Явное удаление:
UniquePtr &operator=(const UniquePtr &object) = delete;
равносильно заключении функции в приватной зоне, но в некоторых случаях этот способ дает больше гарантии для избежании от неявных ошибок(смотри комментарий от
KoVadim)
, делает интерфейс более наглядным.