我在学习C ++时遇到了以下练习题和答案,我不明白。
假设:
class B {}; struct A { A( B b ); };
使用两个对应的变量
调用函数voidtest( A a, int* b=0);
B b, int i;
答案是
test( b, &i );
我的问题是,如何传递构造函数的必要参数而不是实际调用它?在我看来,答案应该是:
test( A(b), &i);
答案 0 :(得分:8)
这是有效的,因为A
有一个单参数构造函数,C ++用作converting constructor:
未使用说明符
explicit
声明并且可以使用单个参数调用的构造函数(直到C ++ 11)称为转换构造函数。与仅在直接初始化期间考虑的显式构造函数(包括诸如static_cast之类的显式转换)不同,在复制初始化期间也会考虑转换构造函数,作为用户定义的转换序列的一部分。
这就是为什么C ++可以将test(b, &i)
解释为test(A(b), &i)
。
如果您不想要此行为,请标记A
的构造函数explicit
。