为什么在函数返回时调用C ++类的复制构造函数?

问题描述

这是程序的一部分:

cls fun(cls a)
{
     cls v;
     v = a.scale(2.0);
     return v;
}
int main()
{
     cls a(0.0,1.0,2.0);
     cls a2;
     a2 = fun(a);
     return 0;
}

在上面的代码中,假定“ cls”类的类定义具有构造函数和“ scale”函数。我的疑问是在主函数中我们实例化了对象a2,然后将其分配给函数的返回值。那么,为什么在这种情况下将调用复制构造函数? (我正在跟随一些资源来理解使用C ++的OOP,并且在那上面提到,在上述情况下,调用了复制构造函数。)

此外,如果我在上面的代码中写:

cls a2 = fun(a);

然后,据我所知,必须调用copy构造函数(因为我们将a2实例化为某物的副本)。现在, fun(a)返回一个临时对象,但是复制构造函数的参数采用一个参考值,因为我们不能采用临时对象的参考值,这不应该给出错误

解决方法

由编译器生成的副本构造函数将const引用作为参数。

允许匿名临时绑定到const引用,以便编译通过。

请注意,在更高版本的C ++标准中,由return v;创建的隐含值副本被删除