为什么输出 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/