2010-10-24 3 views
7

Предположим, что у меня есть классконструктор с одним параметром по умолчанию

class C { 
     C(int a=10); 
}; 

почему, если я называю

C c; 

застройщик C(int =10) называется и если я называю

C c(); 

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

+3

Как насчет того, чтобы предоставить нам компилируемый фрагмент кода, который показывает нам поведение, которое, по вашему мнению, вы видите? Как вы можете видеть из ответов до сих пор, то, что вы описываете, не то, что должен делать код. – sbi

+0

Как и FYI, MSVC (начиная с по крайней мере VS2003) предоставит предупреждение об этой проблеме: 'warning C4930: 'C c (void)': прототипированная функция не была вызвана (было ли определение переменной предназначено?)' Я знаю другие компиляторы также, но те, которые я легко имею в настоящее время, нет. –

ответ

17
  1. На самом деле, C c(); должен быть проанализирован как объявления функции. Чтобы явно вызвать конструктор по умолчанию, вам нужно написать C c = C();.
  2. Как только вы определите какой-либо конструктор, компилятор будет не предоставляет конструктор по умолчанию для вашего типа, поэтому никто не может быть вызван.
  3. Поскольку ваш конструктор может быть вызван одним аргументом, он выполняет функцию неявного преобразования. Вы должны подумать о том, чтобы сделать это explicit, чтобы предотвратить неявное переключение из-за неожиданных моментов.
+0

@Greg: Спасибо, я не уверен, как мне это удалось! ':)' – sbi

14

Код C c(); не делать то, что вы думаете, что делает:

Он объявляет функцию под названием c, который не принимает никаких аргументов и возвращает C. Это эквивалентно

C c(void); 
+0

Важно то, что он ничего не делает (с точки зрения поведения во время выполнения). –

1

Это происходит потому, что c() интерпретируется как функция с именем c. C() вызовет соответствующий конструктор для класса C

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