2011-05-10 3 views
1

, если у меня есть конструкторы с параметрами в моем классе, мы должны обеспечить ничегонеделания конструктор как:конструкторы по умолчанию в 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), поэтому мы не можем предоставить конструктор do-nothing во втором случае. Так верно, что даже неявный конструктор, предоставляемый компилятором, получает в этом случае подтверждение.

Просьба указать некоторые пояснения/мысли.

+5

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

+1

Программирование никогда не касалось компилятора! –

+1

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

ответ

6

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

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

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

3

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

+1

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

1

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

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

Смежные вопросы