Как удалить конструктор по умолчанию?
Вопрос: Как предотвратить неявное предоставление конструктора по умолчанию в C++ до версии 11?
Иногда мне не нужно предоставлять конструктор по умолчанию, и при этом я не хочу, чтобы компилятор создавал стандартный конструктор для моего класса. В C++11 я мог сделать следующее:
class MyClass
{
public:
MyClass() = delete;
};
Однако мой преподаватель не позволяет использовать данную конструкцию в задании. Вопрос: существует ли способ в C++ до 11-й версии, чтобы запретить компилятору неявно предоставлять конструктор по умолчанию?
3 ответ(ов)
Конечно. Определите свой собственный конструктор, по умолчанию или другой.
Вы также можете объявить его как приватный, чтобы сделать невозможным его вызов. К сожалению, это сделает ваш класс совершенно непригодным для использования, если вы не предложите статическую функцию для его вызова.
Я бы предложил сделать конструктор приватным. Например, так:
class MyClass
{
private:
MyClass();
};
Таким образом, никто (извне класса или из классов-друзей) не сможет вызвать конструктор по умолчанию. В результате у вас останется три варианта использования этого класса: либо предоставить конструктор с параметрами, либо использовать его как утилитарный класс (состоящий только из статических функций), либо создать фабрику для этого типа в дружественном классе.
С версии C++11 вы можете объявить конструктор с помощью = delete
. Это полезно в сочетании с синтаксисом инициализации фигурными скобками {}
.
Например:
struct foo {
int a;
foo() = delete; // Удаленный конструктор по умолчанию
foo(int _a) {
// Рабочий конструктор с аргументом
}
};
foo f{}; // Ошибка: использование удаленной функции foo::foo()
foo f{3}; // ОК
Как видно из примера, попытка создать объект foo
без аргументов ведет к ошибке, так как конструктор по умолчанию удален. Однако создание объекта с одним аргументом 3
происходит успешно, так как соответствующий конструктор доступен.
Вы можете узнать больше о удаленных неявно объявленных конструкторах на cppreference.com.
Как удалить элемент из std::vector<> по индексу?
`unsigned int` против `size_t`: когда и что использовать?
Какова разница между "new", "malloc" и "calloc" в C++?
Что означает && в конце сигнатуры функции (после закрывающей скобки)?
Инициализация std::string из char* без копирования