我正在做一些C ++测试而且我不理解下面的代码:
class A
{
public:
A(int n = 0): m_n(n)
{
std::cout << 'd';
}
A(const A& a): m_n(a.m_n)
{
std::cout << 'c';
}
private:
int m_n;
};
void f(const A &a1)
{
}
int main()
{
//Call 'f' function and prints: d
f(3);
return 0;
}
我不明白为什么在这里调用构造函数并打印&#39; d&#39;?
谢谢。
答案 0 :(得分:8)
您正在将int
值传递给想要引用A
值的函数。为了提供该参数,使用转换构造函数A
创建临时A(int)
,打印'd'
。
在函数返回后,临时在表达式语句的末尾被销毁。
请注意,仅当引用为const
或 rvalue 引用时,此方法才有效。临时值不能绑定到非const lvalue 引用;所以,如果参数类型是A&
,那么你应该得到一个错误。
它还要求转换可以隐式完成;您可以通过声明构造函数explicit
来阻止此转换。
答案 1 :(得分:2)
A(int n = 0): m_n(n)
{
std::cout << 'd';
}
这是一个转换构造函数。当函数需要A
类型的参数但提供了int
变量时,它将 隐式转换为 到{{1使用此转换构造函数。
要避免此隐式转换,可以将A
说明符添加到构造函数中。
explicit