当我定义一个具有类(非引用)返回类型的函数时,调用类的默认构造函数或复制构造函数

Which one -- default or copy constructor -- of a class gets called when I define a function that has (non-reference) return type of that class?

本文关键字:构造函数 函数 复制 默认 返回类型 调用 定义 一个 引用      更新时间:2023-10-16

当我用前面提到的类的返回类型在另一个类中定义函数时,我很困惑为什么我必须为这个类编写复制构造函数。

例如:

class Foo{
    // attributes
public:
    Foo(){...}
    // I had to write the CC
    Foo(const Foo& obj){
        //...
    }
}
class Bar{
// ....
// This is the function
Foo SomeFunction()
{
    Foo myVar;
    // ....
    return myVar;
}

我通过couting检查了复制构造函数是否被实际调用。

不过,我需要确认,因为在这种情况下调用默认构造函数似乎更合乎逻辑,比如在创建myVar的这一行中。

我是一个初学者,所以我正试着把注意力集中在这些电话上。

Foo myFunc;

调用默认构造函数。

线路

return myFunc;

调用复制构造函数,因为函数的返回类型是Foo。函数返回的对象不是myFunc,而是myFunc的副本。当函数返回时,myFunc被删除。副本是调用函数得到的。

如果编译器能够使用RVO(返回值优化),那么myFunc将返回给调用函数,而不是副本。在这种情况下,将不会调用复制构造函数。

您不必在C++上编写CC。编译器应该给你一个。是的,在这种情况下会调用CC,因为您试图将返回值作为副本传递。