Подтвердить что ты не робот

Как запретить использование конструктора по умолчанию в С++?

Я не хочу, чтобы в моей программе можно было создать объект, не передавая аргументы конструктору.

Есть ли способ?

4b9b3361

Ответ 1

Когда вы объявляете какой-либо другой конструктор, компилятор не будет генерировать для вас конструктор по умолчанию. Если вы указали конструктор без аргументов по умолчанию, вы можете сделать его закрытым.

Помните, что компилятор может автоматически генерировать каждую из этих четырех функций-членов для класса.

  • default конструктор аргументов
  • деструктор по умолчанию
  • конструктор копирования
  • оператор присваивания

Но он не будет генерировать значение по умолчанию, если вы сами его объявили, т.е. если вы сами объявили конструктор, он не будет создавать конструктор по умолчанию. Если вы не объявили ни одного из других 3, компилятор может их генерировать.

edit: Обратите внимание, что эта информация относится к С++ 03, но в С++ 11 она отличается, как упоминает Маттиу М. в комментариях.

Ответ 2

В то время как другие ответы верны, в С++ 11 есть новая методика для выражения: http://www2.research.att.com/~bs/C++0xFAQ.html#default

Это позволяет запретить функцию без какого-либо другого трюка. Он также четко выражает ваше намерение в коде.

class X
{ 
public:
    X(int) {}
    X() = delete; // will never be generated
};

int main()
{ 
    X x; // will not compile;
    X y(1); // will compile.
    return 0;
}

Ответ 3

Определите конструктор, который принимает правильный аргумент (ы). Это не позволит компилятору определить конструктор по умолчанию.

class X { 
public:
   X(int) {}
};

int main(){ 
    X x; // will not compile;
    X y(1); // will compile.
    return 0;
}

Ответ 4

Причина, по которой вы можете создать объект, не передавая аргументы конструктору, заключается в том, что у вас есть конструктор по умолчанию. Конструктор по умолчанию - это своего рода конструктор, который не имеет параметра или всех параметров, имеющих значения по умолчанию. И если вы не объявили какой-либо конструктор, компилятор сделает его для вас. Таким образом, решение очень просто. Вы можете объявить конструктор с параметром без значения по умолчанию, тогда компилятор не захочет сделать для вас конструктор.

Ответ 5

создание непустого конструктора "отменяет" пустой конструктор по умолчанию, поэтому, если вы явно не создаете пустой конструктор, объекты не будут создаваться без аргументов.

Ответ 6

Создайте собственный конструктор по умолчанию.