繁体   English   中英

为什么我的复制构造函数不起作用? (C++)

[英]Why is my copy constructor not working? (C++)

我正在研究 C++ 并创建了这个简单的代码来练习复制构造函数。

class Cube{
    private:
        double length;
    public:
        Cube(){
            length = 1;
            cout << "default constructor called" << endl;
        };
        Cube(const Cube& obj){
            length = obj.length;
            cout << "copy constructor called" << endl;
        };
};

Cube foo(){
    Cube c;
    return c;
}

int main(){
    Cube c2 = foo();
    return 0;
}

我希望这能打印出来
“调用默认构造函数”
“调用复制构造函数”
“调用复制构造函数”
因为默认构造函数在“Cube C”中调用,而复制构造函数在“return c”和“Cube c2 = foo()”中调用。

但是我的控制台只显示“调用默认构造函数”

我是否误解了复制构造函数的工作原理?

这不会调用您的复制构造函数,而是将 foo 中创建的 object 初始化为 c2。

Cube c2 = foo();

这将调用 = 赋值运算符:

Cube c2; // default constructor
c2 = foo(); // default constructor inside foo() and then assignment operator

这将调用复制构造函数:

Cube c3; // default constructor
Cube c2(c3); // copy constructor

复制构造函数的语法如下:

Cube(const Cube& obj)

它是一个构造函数,用于从另一个 object 创建 object 的副本。

但是我的控制台只显示“调用默认构造函数”

因为复制省略

你的期望是对的。 概念上有两种复制结构,第一种用于return c; 复制初始化c的返回值; 第二个是Cube c2 = foo(); ,从foo()的返回值 复制初始化c2 由于复制省略,它们都被省略了,然后根本不调用复制构造函数。

对于第一个,

在返回语句中,当操作数是具有自动存储期限的非易失性 object 的名称时,它不是 function 参数或 catch 子句参数,并且与 ZA2F2ED4F8EBC2CBB164C21A29-qualification 类型相同function 返回类型。 这种复制省略的变体被称为 NRVO,“命名返回值优化”。

对于第二个,

在 object 的初始化中,当初始化表达式是与变量类型相同的 class 类型(忽略 cv 限定)的纯右值时:

 T x = T(T(f())); // only one call to default constructor of T, to initialize x

请注意,第二个是强制性的,因为 C++17。

顺便说一句:使用-fno-elide-constructors选项(以避免潜在的复制省略)在 C++17 之前的模式下编译(以避免强制复制省略)会得到您预期的结果。 与 gcc 一起直播

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM