为什么在函数 returns 时调用复制构造函数(C++ class)?
Why does the copy constructor (of a C++ class) get called when a function returns?
这是一个程序片段:
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;
}
在上面的代码中,假设 class 定义的 class "cls" 已经定义了构造函数和 "scale" 函数。我的疑问是在 main 函数中我们实例化了对象 a2,然后将其分配给函数的 return 值。那么,为什么在这种情况下会调用复制构造函数呢? (我正在关注一些资源以了解使用 C++ 的 OOP,那里提到在上述情况下调用了复制构造函数。)
此外,在上面的代码中,如果我写:
cls a2 = fun(a);
然后,根据我的理解,必须调用复制构造函数(因为我们将 a2 实例化为某物的副本)。现在,fun(a) returns是一个临时对象,但是拷贝构造函数的参数是取一个引用值,因为我们不能取一个临时对象的引用值,这不应该报错吗?
编译器生成的复制构造函数将 const
引用作为参数。
允许匿名临时绑定到 const
引用,因此编译通过。
请注意,由 return v;
创建的隐含值副本在以后的 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;
}
在上面的代码中,假设 class 定义的 class "cls" 已经定义了构造函数和 "scale" 函数。我的疑问是在 main 函数中我们实例化了对象 a2,然后将其分配给函数的 return 值。那么,为什么在这种情况下会调用复制构造函数呢? (我正在关注一些资源以了解使用 C++ 的 OOP,那里提到在上述情况下调用了复制构造函数。)
此外,在上面的代码中,如果我写:
cls a2 = fun(a);
然后,根据我的理解,必须调用复制构造函数(因为我们将 a2 实例化为某物的副本)。现在,fun(a) returns是一个临时对象,但是拷贝构造函数的参数是取一个引用值,因为我们不能取一个临时对象的引用值,这不应该报错吗?
编译器生成的复制构造函数将 const
引用作为参数。
允许匿名临时绑定到 const
引用,因此编译通过。
请注意,由 return v;
创建的隐含值副本在以后的 C++ 标准中被 删除 。