问题描述
这是程序的一部分:
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;
创建的隐含值副本被删除。