为什么输出 foo3 等于 3
我建议,当调用bar(foo1)时,函数bar在堆栈上创建一个foo1的副本,因此其值等于0,当返回此值时,foo3的copy-constructor再次使该值递增,因此应为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,以及foo1bar返回。

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

#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/

10-11 22:25
查看更多