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

C++ Constructor called from function by reference

本文关键字:C++ 构造函数 函数调用 引用      更新时间:2023-10-16

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

我不明白的是,为什么在这里调用构造函数并打印"d"?

谢谢。

int值传递给想要引用A值的函数。为了提供该参数,使用转换构造函数A(int)创建临时A,打印'd'

在函数返回后,临时函数将在表达式语句的末尾销毁。

请注意,只有当引用是const右值引用时,这才有效。临时值不能绑定到非常量左值引用;因此,如果参数类型是A&,那么应该会得到一个错误。

它还要求转换可以隐含地进行;您可以通过声明构造函数explicit来阻止这种转换。

A(int n = 0): m_n(n)
{
    std::cout << 'd';
}

这是一个转换构造函数。当函数需要A类型的参数,但提供了int变量时,将使用此转换构造函数将其隐式转换为A

为了避免这种隐式转换,可以将explicit说明符添加到构造函数中。

explicit A(int n = 0): m_n(n)
{
    std::cout << 'd';
}