Ключевое слово = delete
Ключевое слово = delete применяется к функциям, методам,
конструкторам, деструкторам и операторам, чтобы явно запретить
их вызов. Если попытаться вызвать удалённую функцию, компилятор
выдаст ошибку на этапе сборки. Это удобный способ запретить
копирование объектов, наследование методов или нежелательные
преобразования типов. Удалять можно как собственные методы класса,
так и унаследованные, а также функции, генерируемые компилятором
автоматически.
Синтаксис
тип имя_функции(параметры) = delete;
Пример
Давайте создадим класс NonCopyable, объекты которого
нельзя копировать. Для этого удалим конструктор копирования
и оператор присваивания:
#include <iostream>
using namespace std;
class NonCopyable
{
public:
NonCopyable() = default;
NonCopyable(const NonCopyable&) = delete;
NonCopyable& operator=(const NonCopyable&) = delete;
};
int main()
{
NonCopyable a;
NonCopyable b(a);
return 0;
}
При попытке компиляции этого кода компилятор выдаст ошибку, так как конструктор копирования был удалён.
Пример
Давайте удалим метод print в базовом классе, чтобы
запретить его вызов у наследника с определённым типом аргумента:
#include <iostream>
using namespace std;
class Base
{
public:
void print(int x)
{
cout << "int: " << x << endl;
}
void print(double) = delete;
};
class Derived : public Base
{
public:
using Base::print;
};
int main()
{
Derived d;
d.print(5);
return 0;
}
Результат выполнения кода:
"int: 5"
Пример
Давайте удалим перегрузку оператора new, чтобы запретить
динамическое выделение памяти для объектов класса:
#include <iostream>
using namespace std;
class StackOnly
{
public:
StackOnly() = default;
void* operator new(size_t) = delete;
void operator delete(void*) = delete;
};
int main()
{
StackOnly obj;
return 0;
}
Объект obj создаётся на стеке успешно, однако выражение
new StackOnly приведёт к ошибке компиляции.
Смотрите также
-
ключевое слово
defaulted,
которое явно требует генерации метода компилятором -
конструктор копирования
copy-ctor,
который создаёт объект на основе другого объекта -
оператор присваивания
copy-assign,
который копирует состояние одного объекта в другой -
ключевое слово
explicit,
которое запрещает неявные преобразования типов