C ++构造函数通过引用从函数调用

时间:2014-08-29 12:41:03

标签: c++

我正在做一些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;?

谢谢。

2 个答案:

答案 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