РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
691 of 815 menu

Ключевое слово = 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,
    которое запрещает неявные преобразования типов
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить