#c
#c
Вопрос:
Я наткнулся на следующий практический вопрос и ответ во время изучения C , и я этого не понимаю.
Учитывая:
class B {}; struct A { A( B b ); };
Вызовите функцию void
test( A a, int* b=0);
с двумя соответствующими переменнымиB b, int i;
Ответ таков
test( b, amp;i );
Мой вопрос в том, как достаточно передать необходимый параметр конструктора и фактически не вызывать его? На мой взгляд, ответ должен был быть:
test( A(b), amp;i);
Ответ №1:
Это работает, потому A
что имеет конструктор с одним аргументом, который C использует в качестве конструктора преобразования:
Конструктор, который не объявлен со спецификатором
explicit
и который может быть вызван с одним параметром (до C 11), называется конструктором преобразования. В отличие от явных конструкторов, которые рассматриваются только во время прямой инициализации (которая включает в себя явные преобразования, такие как static_cast), конструкторы преобразования также рассматриваются во время инициализации копирования, как часть определяемой пользователем последовательности преобразования.
Вот почему C может интерпретировать test(b, amp;i)
как test(A(b), amp;i)
.
Если вы не хотите такого поведения, отметьте A
конструктор explicit
.