为什么在函数返回时会调用(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);

然后,根据我的理解,必须调用复制构造函数(因为我们将 a2 实例化为某物的副本)。现在,fun(a)返回一个临时对象,但是复制构造函数的参数需要一个引用值,因为我们不能获取临时对象的引用值,这不应该出错吗?

拔示巴

编译器生成的复制构造函数将const引用作为参数。

允许匿名临时对象绑定到const引用,因此编译通过。

需要注意的是通过创建隐含值拷贝return v;省略掉在后面的C ++标准。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

模板类的复制构造函数

异常类复制构造函数

从派生复制构造函数调用基类的移动构造函数

为什么成员初始化程序在移动时会调用额外的构造函数调用?

为什么在调用非静态方法时会调用结构中的静态构造函数?

为什么在函数返回时不调用复制构造函数?

模拟复制构造函数的C ++类

为什么在克隆 DataTable 时会调用这么多构造函数?

复制构造函数访问其类的字段?

复制构造函数的类实例化

复制抽象类的构造函数

为什么String类具有复制构造函数?

C ++类模板复制构造函数返回类型

为什么超级函数会调用自己的构造函数?

为什么带有非const复制构造函数的类不被视为可复制构造?

为什么复制构造函数被调用?

为什么复制构造函数被调用?

为什么调用复制构造函数而不是移动构造函数?

为什么调用复制构造函数而不是移动构造函数?

删除复制构造函数的类仍然可以复制吗?

为什么带有虚函数的C ++类必须具有非平凡的复制构造函数?

用基类的复制构造函数替换默认的复制构造函数(C ++)

删除复制构造函数时,为什么重载决议不会返回到参考基类的构造函数?

返回时调用C ++复制构造函数

复制派生类的构造函数,更改基类

使用列表类的堆栈类的复制构造函数

返回时,为什么调用复制构造函数而不是move构造函数?

如何获得指向类的复制构造函数的成员函数指针?

类复制构造函数和指向成员的指针函数