Как запретить использование конструктора по умолчанию в C ++? - PullRequest
19 голосов
/ 09 ноября 2011

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

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

Ответы [ 6 ]

20 голосов
/ 09 ноября 2011

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

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

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

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

edit: обратите внимание, что эта информация относится к C ++ 03, но в C ++ 11 она отличается от Matthieu MУпоминает в комментариях.C ++ 11 также позволяет явно запрещать конструктор.См. Ответ Офирмо .

18 голосов
/ 10 ноября 2011

Хотя остальные ответы верны, в C ++ 11 есть новый метод выражения: удаленный конструктор по умолчанию

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

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;
}
6 голосов
/ 09 ноября 2011

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

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

int main(){ 
    X x; // will not compile;
    X y(1); // will compile.
    return 0;
}
2 голосов
/ 09 ноября 2011

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

1 голос
/ 09 ноября 2011

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

0 голосов
/ 09 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...