Конструкторы по умолчанию в C

#c #constructor

#c #конструктор

Вопрос:

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

1)

 class A
{
  A(){};  //To satisfy the compiler
  //some constructors with parameter
};
  

просто чтобы удовлетворить компилятор.

Теперь, если мой класс имеет параметр по умолчанию, подобный :

2)

 class A
{
//A(){} can't be used expilcilty or implicilty
A(int = 0);
};
A a;
  

Будет неясно, вызывать A::() или A ::A(int = 0), поэтому мы не можем предоставить какой-либо конструктор «ничего не делать» во втором случае.
Итак, верно ли, что даже неявный конструктор, предоставляемый компилятором, в этом случае подавляется.

Пожалуйста, предоставьте некоторые разъяснения / соображения.

Комментарии:

1. Обратите внимание, что вам не нужно указывать конструктор с нулевым аргументом, чтобы «удовлетворить компилятор».

2. Программирование никогда не было направлено на удовлетворение потребностей компилятора!

3. Вам не обязательно иметь конструктор по умолчанию, чтобы удовлетворить требования компилятора. Вам нужно иметь один, если вы собираетесь делать что-то, для чего требуется конструктор по умолчанию, что-то вроде A a; или A b[10]; или A * c = new A[10]; . Нет требования, чтобы у класса был конструктор по умолчанию.

4. кажется, в книге, которую я читал несколько минут назад, есть ошибки, в ней были такие words…to удовлетворяют требованиям компилятора… Спасибо, что сообщили мне все это

Ответ №1:

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

Компилятор не будет генерировать один, если вы его предоставили.

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

Ответ №2:

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

Комментарии:

1. И не имеет значения, сколько параметров, по умолчанию или нет, есть у вашего ctor, компилятор не сгенерирует ни одного, если вы укажете какой-либо (кроме параметра копировать и перемещать ctor).

Ответ №3:

Если вам нужно явно отключить использование конструктора, вы можете сделать это private в классе.

Обратите внимание, что компилятор не должен жаловаться на то, что вы не предоставляете конструктор. В ту минуту, когда вы предоставляете один — и только один — он должен автоматически прекратить предоставление конструктора по умолчанию