почему конструктор по умолчанию в некоторых случаях недоступен - PullRequest
3 голосов
/ 02 июля 2010
class foo {
public:
   int a;
   int b;
   foo(int a_, int b_) : a(a_), b(b_) {}
};

int main() {
  foo f;
}

когда я пытаюсь скомпилировать приведенный выше фрагмент кода, я получаю сообщение об ошибке, как показано ниже:

foo.cc: In function 'int main()'

foo.cc:12: error: no matching function for call to 'main()::foo::foo()'

foo.cc:10: note: candidates are: main()::foo::foo(int, int)

foo.cc:6:  note:                 main()::foo::foo(const main()::foo&)

, но если я закомментирую файл явного конструктора с двумя целочисленными параметрами, то кодбыть скомпилированным.Я полагаю, что за волшебством стоит правило, что когда вы объясняете объявить конструктор с параметрами, компилятор c ++ не будет автоматически генерировать конструктор по умолчанию без параметров для вас.

Я прав?Если я прав, почему c ++ имеет такое поведение?заранее спасибо.

Ответы [ 4 ]

9 голосов
/ 02 июля 2010

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

C ++ Стандарт 12.1 / 5:

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

2 голосов
/ 02 июля 2010

Да, вы правы. Если вы объявляете конструктор, он не объявляет никаких неявных. Что касается почему, я не уверен.

1 голос
/ 02 июля 2010

По сути, если у вас нет явного конструктора, C ++ пытается быть совместимым со структурами C и другими простыми старыми типами данных, предоставляя конструктор по умолчанию, чтобы его объекты могли быть определены и использованы нормально.Но если у вас есть явный конструктор, C ++ больше не предоставляет это значение по умолчанию, поскольку вы должны полностью контролировать, как могут использоваться объекты ваших классов (например, как они должны создаваться).Таким образом, если вы не укажете конструктор по умолчанию, у вас могут быть объекты, которые нельзя конструировать без параметров, что часто бывает полезно.

1 голос
/ 02 июля 2010
class foo {
public:
    foo(int a_ = 0, int b_ = 0) : a(a_), b(b_) {}
    int a;
    int b;
};

Язык C генерирует ctor по умолчанию, только если вы сами его не указали.Вы можете указать аргументы по умолчанию для вашего ctor, хотя

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