c++ - 有人可以解释这个 C++ 程序的输出吗?

标签 c++ rvo nrvo

为什么输出 foo3 等于 3 ? 我建议,当 bar(foo1) 被调用时,函数 bar 在堆栈上创建一个 foo1 的拷贝,所以它的值是相等的到 0,当返回此值时,foo3 的复制构造函数再次递增该值,所以它应该是 2?

提前致谢。

这是我的代码:

#include <iostream>
struct Foo {
    Foo()
        : x(0)
    {
    }
    Foo(const Foo& foo)
        : x(foo.x + 1)
    {
    }
    int x;
};

Foo bar(Foo foo)
{
    foo.x++;
    return foo;
}

int main()
{
    Foo foo1;
    Foo foo2 = foo1;
    std::cout << "A:" << foo1.x << std::endl;
    std::cout << "B:" << foo2.x << std::endl;
    Foo foo3 = bar(foo1);
    std::cout << "C:" << foo3.x << std::endl;
}

输出:

A:0
B:1
C:3

最佳答案

我相信这里有三个复制构造函数在起作用,foo2 = foo1 行,将 foo1 传递给 bar,以及从 bar 返回 foo1

修改您的代码可以清楚地了解正在发生的事情:

#include <iostream>
struct Foo {
    Foo()
        : x(0)
    {
        std::cout << "Constructor called" << std::endl;
    }
    Foo(const Foo& foo)
        : x(foo.x + 1)
    {
        std::cout << "Copy constructor called" << std::endl;
    }
    int x;
};

Foo bar(Foo foo)
{
    std::cout << "B2:" << foo.x << std::endl;
    foo.x++;
    return foo;
}

int main()
{
    Foo foo1;
    Foo foo2 = foo1;
    std::cout << "A:" << foo1.x << std::endl;
    std::cout << "B:" << foo2.x << std::endl;
    Foo foo3 = bar(foo1);
    std::cout << "C:" << foo3.x << std::endl;
}

输出:

Constructor called
Copy constructor called
A:0
B:1
Copy constructor called
B2:1
Copy constructor called
C:3

关于c++ - 有人可以解释这个 C++ 程序的输出吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37815860/

相关文章:

c++ - 创建未知类的对象(两个继承类)

c++ - 如何在我自己的赋值运算符中调用默认赋值运算符?

c++ - DLL注册和注销

c++ - 当没有为类定义复制构造函数时,是否会发生 RVO 优化?

c++ - 传递 vector 引用是否会转移其数据的所有权?

c++ - 在构造函数中创建数组和在 C++ 中声明数组之间的区别

gcc - 为什么在初始化静态方法时允许私有(private)移动构造函数?

c++ - 为什么要依赖命名返回值优化?

c++ - 如何确保执行 RVO 而不是复制?

C++NRVO 保证?或者更好地选择非常量引用参数或shared_ptr?