为什么在这段代码片段中复制构造函数被调用了两次?

c_student

我正在玩一些东西来了解复制构造函数的工作原理。但我无法理解为什么复制构造函数被调用两次以创建x2. 我会假设它会在返回值createX()被复制到x2.
我还查看了一些关于 SO 的相关问题,但据我所知,我找不到与我在这里问的相同的简单场景。

顺便说一句,我正在编译-fno-elide-constructors以查看没有优化的情况。

#include <iostream>

struct X {
    int i{2};

    X() {
        std::cout << "default constructor called" << std::endl;
    }

    X(const X& other) {
        std::cout << "copy constructor called" << std::endl;
    }
};

X createX() {
    X x;
    std::cout << "created x on the stack" << std::endl;
    return x;
}

int main() {
    X x1;
    std::cout << "created x1" << std::endl;
    std::cout << "x1: " << x1.i << std::endl << std::endl;    

    X x2 = createX();
    std::cout << "created x2" << std::endl;
    std::cout << "x2: " << x2.i << std::endl;    

    return 0;
}

这是输出:

default constructor called
created x1
x1: 2

default constructor called
created x on the stack
copy constructor called
copy constructor called
created x2
x2: 2

有人可以帮助我在这里缺少或忽略什么吗?

内森奥利弗

这里你必须记住的是,函数的返回值是一个不同的对象。当你做

return x;

你复制初始化返回值对象x这是您看到的第一个复制构造函数调用。然后

X x2 = createX();

使用返回的对象复制初始化,x2因此这是您看到的第二个副本。


需要注意的一件事是

return x;

x如果可以,将尝试移入返回对象。如果您创建了一个移动构造函数,您就会看到它被调用。这样做的原因是,由于局部对象在函数结束时超出范围,编译器将该对象视为右值,并且只有在未找到有效重载时才会回退到将其作为左值返回。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在下面的程序中两次调用了复制构造函数?

来自分类Dev

为什么构造函数被两次调用

来自分类Dev

为什么bean构造函数被调用两次?

来自分类Dev

JUNIT测试-为什么构造函数被两次调用

来自分类Dev

为什么构造函数被两次调用

来自分类Dev

为什么我的构造函数被两次调用

来自分类Dev

为什么这个构造函数被调用两次?

来自分类Dev

为什么在storage.single中两次调用了我的函数?

来自分类Dev

为什么在此示例中调用了复制构造函数?

来自分类Dev

为什么代码两次调用析构函数?

来自分类Dev

为什么在我的程序中两次调用构造函数?

来自分类Dev

为什么在Java中两次使用构造函数

来自分类Dev

为什么析构函数被调用两次而构造函数仅被调用一次?

来自分类Dev

片段-onGlobalLayout()调用了两次

来自分类Dev

为什么onResume()似乎被调用了两次?

来自分类Dev

为什么DetermineState:forRegion:方法被调用了两次

来自分类Dev

为什么DetermineState:forRegion:方法被调用了两次

来自分类Dev

为什么在对std :: vector :: emplace_back()的调用中调用了复制构造函数?

来自分类Dev

为什么在此链表实现中,此C ++构造函数在同一内存位置被调用两次?

来自分类Dev

为什么在 C++ 中重载后增量运算符会调用构造函数两次?

来自分类Dev

为什么在我的程序中两次调用了operator()?

来自分类Dev

为什么派生类可以调用基类构造函数两次?

来自分类Dev

为什么我的C ++程序的副本构造函数被调用两次?

来自分类Dev

为什么在调用一个函数后两次将此代码弹出到同一寄存器中两次?

来自分类Dev

为什么基类的构造方法被调用两次?

来自分类Dev

为什么在我的代码中调用复制构造函数而不是移动构造函数?

来自分类Dev

为什么在这段代码中显示 Queue 函数只打印第一次插入的值几次?

来自分类Dev

在C ++中,构造函数两次调用过吗?

来自分类Dev

在构造函数中两次调用InitializeComponent()

Related 相关文章

  1. 1

    为什么在下面的程序中两次调用了复制构造函数?

  2. 2

    为什么构造函数被两次调用

  3. 3

    为什么bean构造函数被调用两次?

  4. 4

    JUNIT测试-为什么构造函数被两次调用

  5. 5

    为什么构造函数被两次调用

  6. 6

    为什么我的构造函数被两次调用

  7. 7

    为什么这个构造函数被调用两次?

  8. 8

    为什么在storage.single中两次调用了我的函数?

  9. 9

    为什么在此示例中调用了复制构造函数?

  10. 10

    为什么代码两次调用析构函数?

  11. 11

    为什么在我的程序中两次调用构造函数?

  12. 12

    为什么在Java中两次使用构造函数

  13. 13

    为什么析构函数被调用两次而构造函数仅被调用一次?

  14. 14

    片段-onGlobalLayout()调用了两次

  15. 15

    为什么onResume()似乎被调用了两次?

  16. 16

    为什么DetermineState:forRegion:方法被调用了两次

  17. 17

    为什么DetermineState:forRegion:方法被调用了两次

  18. 18

    为什么在对std :: vector :: emplace_back()的调用中调用了复制构造函数?

  19. 19

    为什么在此链表实现中,此C ++构造函数在同一内存位置被调用两次?

  20. 20

    为什么在 C++ 中重载后增量运算符会调用构造函数两次?

  21. 21

    为什么在我的程序中两次调用了operator()?

  22. 22

    为什么派生类可以调用基类构造函数两次?

  23. 23

    为什么我的C ++程序的副本构造函数被调用两次?

  24. 24

    为什么在调用一个函数后两次将此代码弹出到同一寄存器中两次?

  25. 25

    为什么基类的构造方法被调用两次?

  26. 26

    为什么在我的代码中调用复制构造函数而不是移动构造函数?

  27. 27

    为什么在这段代码中显示 Queue 函数只打印第一次插入的值几次?

  28. 28

    在C ++中,构造函数两次调用过吗?

  29. 29

    在构造函数中两次调用InitializeComponent()

热门标签

归档